zoukankan      html  css  js  c++  java
  • 【290】Python 模块

    参考:Python 模块


    目录:


    Python 模块 (Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和 Python 语句。
    模块让你能够有逻辑地组织你的 Python 代码段。
    把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
    模块能定义函数,类和变量,模块里也能包含可执行的代码。

    1. import 语句(模块的引入)
     

    模块定义好后,我们可以使用 import 语句来引入模块,语法如下:

    import module1[, module2[,... moduleN]
    

    比如要引用模块 math,就可以在文件最开始的地方用  import math  来引入。在调用 math 模块中的函数时,必须这样引用:

    模块名.函数名 
    

    当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

    需要将以下两个文件放置在同一个文件夹内(自动搜索当前目录)

    目录结构如下:

    ...
      |--support.py
      |--test.py
    

    源代码如下:

    support.py  

    # coding=utf-8
    
    def print_func( par ):
    	print "Hello : ", par
    	return
    

    test.py  

    # coding=utf-8
    # 导入模块
    import os
    import support
    # 现在可以调用模块里包含的函数了
    support.print_func("Runoob")
    
    # 用于暂停显示,否则窗体会一闪而过
    os.system("pause")
    

    以上实例输出结果: 

    Hello : Runoob
    

    2. From…import 语句
     

    Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下: 

    from modname import name1[, name2[, ... nameN]]
    

    例如,要导入模块 math 的 log 和 log10 函数,使用如下语句:

    >>> from math import log, log10
    >>> log(2)
    0.6931471805599453
    

    这个声明不会把整个 math 模块导入到当前的命名空间中,它只会将 math 里的 log/log10 单个引入到执行这个声明的模块的全局符号表。


    3. From…import * 语句
     

    把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

    from modname import *
    

    这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
    例如我们想一次性引入 math 模块中所有的东西,语句如下: 

    from math import *
    

    4. dir() 函数
     

    dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
    返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:

    >>> import math
    >>> content = dir(math)
    >>> print content
    ['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 
    'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 
    'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 
    'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
    

    在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。


    5. Python 中的包
     

    包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
    简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
    存在两种引用方式,其一为引用所需要的函数,可以直接使用,其二为引用所有的文件,使用时需要 模块名+函数名形式

    5.1 在 *.py 文件中引用自定义包

    ☀☀☀<< 举例 >>☀☀☀
    引用全部函数形式:目录结构如下

    ...
      |--test.py
      |--package_01
           |--__init__.py
           |--module_1.py
           |--module_2.py
    

    源代码如下:

    package_01/module_1.py  

    # coding=utf-8
    
    def run_11():
    	print "I'm in run_11"
    
    def run_12():
    	print "I'm in run_12"
    

    package_01/module_2.py  

    # coding=utf-8
    
    def run_21():
    	print "I'm in run_21"
    
    def run_22():
    	print "I'm in run_22"
    

    现在,在 package_runoob 目录下创建 __init__.py,__init__.py可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,__init__.py 中也可以设置相应的内容。
    本例中 __init__.py 设置为空,然后是 test.py 文件

    test.py  

    # coding=utf-8
    
    # 将包内的函数导入,用的时候可以直接写函数名称
    from package_1.module_1 import run_11
    from package_1.module_1 import run_12
    from package_1.module_2 import run_21
    from package_1.module_2 import run_22
    
    run_11()
    run_12()
    run_21()
    run_22()
    

    以上实例输出结果如下:

    I'm in run_11
    I'm in run_12
    I'm in run_21
    I'm in run_22
    

    ☀☀☀<< 举例 >>☀☀☀
    引用全部函数形式:目录结构如下

    ...
      |--test1.py
      |--package_01
           |--__init__.py
           |--module_1.py
           |--module_2.py
    

    源代码如下:

    module_1.py 与 module_2.py 和上面文件内容一样,主要看 __init__.py 与 test1.py 文件中的内容

    __init__.py 

    # coding=utf-8
    
    # 将其他文件名包含进来
    __all__ = ['module_1', 'module_2']
    

    test1.py  

    # coding=utf-8
    
    # 将包全部导入,用的时候需要通过 模块.函数 的形式
    from package_1 import *
    
    module_1.run_11()
    module_1.run_12()
    module_2.run_21()
    module_2.run_22()
    

    运行结果与上面一样

    说明:如果在 module_2 中调用 module_1 的函数,操作如下:

     module_2.py 

    ...
    def a():
    	# 导入包
    	import package_01
    	# 直接完整调用 module_1 中的函数
    	package_01.module_1.fuc()
    ...
    

    参考:Python中__init__.py文件的作用详解

    5.2 在控制台中引用自定义包

    具体内容如上所示,调用源码如下:

    >>> import sys
    >>> # 添加包所在的文件夹
    >>> sys.path.append(r"D:package2")
    >>> # 以下内容与 5.1 一致
    >>> from package_1 import *
    >>> module_1.run_11()
    I'm in run_11
    >>> module_1.run_12()
    I'm in run_12
    

    6. PYTHONPATH 变量
     

    作为环境变量,PYTHONPATH 由装在一个列表里的许多目录组成。

    当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

        1、当前目录
        2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
        3、如果都找不到,Python会察看默认路径。模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

    通过将变量添加到 PYTHONPATH 变量中,就可以直接引用相应的包,如下将“D:3-StudyPythonModule”添加到 PYTHONPATH 变量中

    计算机 → 属性 → 高级系统设置 → 高级 → 环境变量 → 系统变量 → 新建 → 变量名:PYTHONPATH(大小写都可以  ) → 变量值:D:3-StudyPythonModule

    参考:Setting up PythonPath (Python Path) system variable for Windows (Blender)

    查看与使用

    >>> import sys
    >>> sys.path
    ['D:\03-Study\Python\Module', ...]
    >>> # 可以直接引入自定义包
    >>> from arcpy_diy import *
    >>> mxd = ap.getCurrentMxd()
    >>> df = ap.getDataFrame_0()
    >>> lyrs = ap.getLyrs()
    

    包内部的函数

    # coding=utf-8
    
    import arcpy
    
    def getLyrs():
    	# 特别注意,直接拷过来代码会出错
    	# 原因是拷过来的代码缩进是空格
    	# 与自动缩进的 tab 键是不同的
    	# 因此需要特别将空格删除,通过选中可看出区别
    	"获取当前 mxd 文件的所有图层"
    	mxd = arcpy.mapping.MapDocument("CURRENT")
    	lyrs = arcpy.mapping.ListLayers(mxd)
    	return lyrs
    
    def getCurrentMxd():
    	"获取当前 mxd 文件的 mxd"
    	mxd = arcpy.mapping.MapDocument("CURRENT")
    	return mxd
    
    def getDataFrame_0():
    	"获取当前 mxd 文件的第一个数据框架"
    	mxd = arcpy.mapping.MapDocument("CURRENT")
    	df = arcpy.mapping.ListDataFrames(mxd)[0]
    	return df
    
    def zoomToLyr( index ):
    	"将地图缩放到指定的图层"
    	mxd = arcpy.mapping.MapDocument("CURRENT")
    	df = arcpy.mapping.ListDataFrames(mxd)[0]
    	lyrs = arcpy.mapping.ListLayers(mxd)
    	df.extent = lyrs[index].getExtent()
    
    def setEnvWorkspace( path ):
    	"设置环境变量"
    	arcpy.env.workspace = path
    
    def exportToJpeg( name ):
    	"将地图文档出图"
    	mxd = arcpy.mapping.MapDocument("CURRENT")
    	df = arcpy.mapping.ListDataFrames(mxd)[0]
    	arcpy.mapping.ExportToJPEG(mxd, arcpy.env.workspace+"\"+name, resolution=300)
    
  • 相关阅读:
    再看机器学习
    普通MLP处理图像时遇到了什么样的问题,才导致后续各种模型的出现
    图像分类算法为什么有那么多?
    算法的时间复杂度到底怎么算?
    [Python]7种基础排序算法-Python实现
    [Python3]星号*的打开方式
    [Pyspark]RDD常用方法总结
    [Python3]为什么map比for循环快
    Sass简介
    最全的DOM事件笔记
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/8290030.html
Copyright © 2011-2022 走看看