模块是指包含 Python 语句和定义的文件。
包含 Python 代码的文件,例如:example.py,称为模块,其模块名称为example。
我们使用模块将大型程序分解为可管理的小型文件。 此外,模块提供了代码的可重用性。
我们可以在模块中定义最常用的函数并将其导入,而不是将其定义复制到其他程序中。
让我们创建一个模块。 输入以下内容并将其另存为example.py。
# Python Module example
def add(a, b):
"""This program adds two
numbers and return the result"""
result = a + b
return result在这里,我们在名为example的模块内定义了函数 add()。 该函数接受两个数字并返回它们的和。
我们可以将模块内部的定义导入另一个模块或 Python 中的交互式解释器。
我们使用import关键字执行此操作。 要导入我们先前定义的模块example,我们在 Python 提示符下键入以下内容。
>>> import example这不会直接在当前符号表中导入在example中定义的函数的名称。 它仅在此处导入模块名称example。
使用模块名称,我们可以使用点.运算符访问该函数。 例如:
>>> example.add(4,5.5)
9.5Python 有大量的标准模块。 您可以查看 Python 标准模块的完整列表及其用例。 这些文件位于 Python 安装位置内的Lib目录中。
可以像导入用户定义的模块一样导入标准模块。
有多种导入模块的方法。 它们在下面列出。
我们可以使用import语句导入模块,并如上所述使用点运算符访问其中的定义。 这是一个例子。
# import statement example
# to import standard module math
import math
print("The value of pi is", math.pi)运行该程序时,输出为:
The value of pi is 3.141592653589793我们可以通过重命名模块来导入模块,如下所示:
# import module by renaming it
import math as m
print("The value of pi is", m.pi)我们已将math模块重命名为m。 在某些情况下,这可以节省我们的键入时间。
请注意,名称math在我们的范围内未被识别。 因此,math.pi无效,并且m.pi是正确的实现。
我们可以从模块导入特定名称,而无需整体导入模块。 这是一个例子。
# import only pi from math module
from math import pi
print("The value of pi is", pi)在这里,我们仅从math模块中导入了pi属性。
在这种情况下,我们不使用点运算符。 我们还可以如下导入多个属性:
>>> from math import pi, e
>>> pi
3.141592653589793
>>> e
2.718281828459045我们可以使用以下结构从模块导入所有名称(定义):
# import all names from the standard module math
from math import *
print("The value of pi is", pi)在这里,我们从math模块中导入了所有定义。 这包括在我们的范围内可见的所有名称,但以下划线(私有定义)开头的名称除外。
导入带有星号(*)符号的所有内容都不是一种好的编程习惯。 这可能导致标识符重复定义。 这也会影响我们代码的可读性。
导入模块时,Python 会在多个位置进行检查。 口译员首先寻找一个内置模块。 然后(如果未找到内置模块),Python 查找sys.path中定义的目录列表。 搜索按此顺序进行。
- 当前目录。
PYTHONPATH(具有目录列表的环境变量)。- 与安装有关的默认目录。
>>> import sys
>>> sys.path
['',
'C:\\Python33\\Lib\\idlelib',
'C:\\Windows\\system32\\python33.zip',
'C:\\Python33\\DLLs',
'C:\\Python33\\lib',
'C:\\Python33',
'C:\\Python33\\lib\\site-packages']我们可以添加和修改此列表以添加我们自己的路径。
Python 解释器在会话期间仅导入一次模块。 这使事情更有效率。 这是一个示例,说明其工作原理。
假设我们在名为my_module的模块中具有以下代码。
# This module shows the effect of
# multiple imports and reload
print("This code got executed")现在我们看到了多次导入的效果。
>>> import my_module
This code got executed
>>> import my_module
>>> import my_module我们可以看到我们的代码只执行了一次。 这说明我们的模块仅导入了一次。
现在,如果我们的模块在程序执行过程中发生了变化,我们将不得不重新加载它。一种方法是重启解释器。 但这并没有太大帮助。
Python 提供了一种更有效的方法。 我们可以使用imp模块内部的reload()函数来重新加载模块。 我们可以通过以下方式做到这一点:
>>> import imp
>>> import my_module
This code got executed
>>> import my_module
>>> imp.reload(my_module)
This code got executed
<module 'my_module' from '.\\my_module.py'>我们可以使用dir()函数找出在模块内部定义的名称。
例如,我们在开始的模块example中定义了一个函数add()。
我们可以通过以下方式在example模块中使用dir:
>>> dir(example)
['__builtins__',
'__cached__',
'__doc__',
'__file__',
'__initializing__',
'__loader__',
'__name__',
'__package__',
'add']在这里,我们可以看到名称的排序列表(以及add)。 所有其他以下划线开头的名称是与模块关联的默认 Python 属性(不是用户定义的)。
例如,__name__属性包含模块的名称。
>>> import example
>>> example.__name__
'example'可以使用dir()函数(不带任何参数)找到当前名称空间中定义的所有名称。
>>> a = 1
>>> b = "hello"
>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', 'pyscripter']