模块允许您逻辑地组织Python代码.将相关代码分组到模块中使代码更易于理解和使用.模块是一个Python对象,具有可以绑定和引用的任意命名属性.
简单地说,模块是一个由Python代码组成的文件.模块可以定义函数,类和变量.模块还可以包含可运行代码.
示例
名为aname的模块的Python代码通常位于namedaname.py文件中.下面是一个简单模块的示例,support.py :
def print_func( par ): print "Hello : ", par return
导入语句
您可以使用任何Python源代码通过在其他Python源文件中执行import语句将文件作为模块. import 具有以下语法 :
import module1[, module2[,... moduleN]
当解释器遇到import语句时,如果模块出现在搜索路径中,它将导入模块.搜索路径是解释程序在导入模块之前搜索的目录列表.例如,要导入模块hello.py,您需要将以下命令放在脚本的顶部并减去;
#!/usr/bin/python3# Import module supportimport support# Now you can call defined function that module as followssupport.print_func("Zara")
执行上述代码时,会产生以下结果 :
Hello : Zara
模块只加载一次,无论导入的次数如何.如果发生多次导入,这可以防止模块执行重复发生.
from ... import语句
Python的来自语句允许您将模块中的特定属性导入当前命名空间. from ... import 具有以下语法 :
from modname import name1[, name2[, ... nameN]]
例如,要从模块fib导入函数fibonacci,请使用以下语句 :
#!/usr/bin/python3# Fibonacci numbers moduledef fib(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a + b return result>>> from fib import fib>>> fib(100)[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
这语句不会将整个模块fib导入当前命名空间;它只是将模块fib中的项目fibonacci引入导入模块的全局符号
表.
from ... import * Statement
还可以使用以下import语句将所有名称从模块导入当前命名空间;
from modname import *
这提供了一种将模块中的所有项目导入当前命名空间的简便方法.谨慎使用此语句.
执行模块作为脚本
在模块中,模块的名称(作为字符串)可用作全局变量__name__的值.模块中的代码将被执行,就像您导入它一样,但__ ____设置为"__main __".
在模块末尾添加此代码 :
#!/usr/bin/python3# Fibonacci numbers moduledef fib(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a + b return resultif __name__ == "__main__": f = fib(100) print(f)
运行上面的代码时,将显示以下输出.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
定位模块
导入模块时,Python解释器按以下顺序搜索模块 :
当前目录.
如果找不到模块,Python会搜索shell变量PYTHONPATH中的每个目录.
如果所有其他方法都失败,Python会检查默认路径.在UNIX上,此默认路径通常为/usr/local/lib/python3/.
模块搜索路径存储在系统中module sys作为 sys.path 变量. sys.path变量包含当前目录,PYTHONPATH和依赖于安装的默认值.
PYTHONPATH变量
PYTHONPATH是一个环境变量,由目录列表组成. PYTHONPATH的语法与shell变量PATH的语法相同.
这是来自Windows系统的典型PYTHONPATH :
set PYTHONPATH = c:\python34\lib;
这是来自UNIX系统的典型PYTHONPATH :
set PYTHONPATH = /usr/local/lib/python
命名空间和范围
变量是名称(标识符)映射到对象. 名称空间是变量名称(键)及其对应的对象(值)的字典.
Python语句可以访问本地命名空间和全局命名空间中的变量.如果本地变量和全局变量具有相同的名称,则局部变量将影响全局变量.
每个函数都有自己的本地名称空间.类方法遵循与普通函数相同的作用域规则.
Python对变量是局部变量还是全局变量进行了有根据的猜测.它假定在函数中赋值的任何变量都是局部的.
因此,为了给函数中的全局变量赋值,必须首先使用全局语句.
语句 global VarName 告诉Python VarName是一个全局变量. Python停止在本地命名空间中搜索变量.
例如,我们在全局命名空间中定义变量 Money .在函数Money中,我们为Money分配一个值,因此Python假定Money作为局部变量.
但是,我们之前访问了局部变量 Money 的值设置它,因此结果是UnboundLocalError.取消注释全局声明可以解决问题.
#!/usr/bin/python3Money = 2000def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1print (Money)AddMoney()print (Money)
dir()函数
dir()内置函数返回一个包含模块定义的名称的字符串的排序列表.
该列表包含所有模块的名称,模块中定义的变量和函数.以下是一个简单的示例 :
#!/usr/bin/python3# Import built-in module mathimport mathcontent = dir(math)print (content)
当执行上面的代码时,它产生以下结果 :
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
这里,特别的字符串变量__name__是模块的名称,和__file__是加载模块的文件名.
globals()和locals()函数
globals()和 locals()函数可用于返回全局和本地名称空间中的名称,具体取决于调用它们的位置.
如果从函数中调用 locals(),它将返回可从该函数本地访问的所有名称.
如果从函数中调用 globals(),它将返回可以从该函数全局访问的所有名称.
这两个函数的返回类型是字典.因此,可以使用键()函数提取名称.
reload()函数
当一个模块导入到脚本中,模块顶层部分的代码只执行一次.
因此,如果要重新执行模块中的顶级代码,可以使用 reload()功能. reload()函数再次导入先前导入的模块. reload()函数的语法是这个 :
reload(module_name)
这里,module_name是要重新加载的模块的名称,而不是包含模块名称的字符串.例如,要重新加载hello模块,请执行以下操作 :
reload(hello)
Python中的包
包是一个分层文件目录结构,它定义了一个由模块,子包和子子包组成的Python应用程序环境,依此类推.
考虑Phone目录中提供的文件 Pots.py .此文件包含以下源代码行 :
#!/usr/bin/python3def Pots():print ("I'm Pots Phone")
类似地,我们还有两个具有不同功能的文件同名以上.它们是 :
手机/Isdn.py 文件具有功能Isdn()
手机/G3.py 文件,功能G3()
现在,在电话目录中再创建一个文件__init__.py :
电话/__初始__.py
要在导入电话时使所有功能可用,您需要在__init__.py中放置显式导入语句如下 :
from Pots import Potsfrom Isdn import Isdnfrom G3 import G3
将这些行添加到__init__.py后,导入Phone包时可以使用所有这些类.
#!/usr/bin/python3# Now import your Phone Package.import PhonePhone.Pots()Phone.Isdn()Phone.G3()
当执行上面的代码时,它产生以下结果 :
I'm Pots PhoneI'm 3G PhoneI'm ISDN Phone
在上面的例子中,我们举了一个函数在每个文件中的例子,但是你可以在您的文件中保留多个功能.您还可以在这些文件中定义不同的Python类,然后您可以从这些类中创建包.