在本文中,您将学习如何用Python创建和导入自定义模块。此外,您还将发现在Python中导入和使用定制和内置模块的不同技术。
模块是指包含Python语句和定义的文件。
包含Python代码的文件,例如:example.py,称为模块,其模块名称为example。
我们使用模块将大型程序分解为可管理的小型文件。此外,模块提供了代码的可重用性。
我们可以在模块中定义最常用的函数并将其导入,而不是将其定义复制到其他程序中。
让我们创建一个模块。输入以下内容并将其另存为example.py。
# Python模块示例 def add(a, b): """这个程序两个数字相加 并返回相加的结果""" result = a + b return result
这里,我们在一个名为example的模块中定义了一个add()。该函数接受两个数字并返回它们的和。
我们可以将模块内部的定义导入另一个模块或Python中的交互式解释器。
我们使用import关键字来做到这一点。要导入我们先前定义的模块,example我们在Python提示符下键入以下内容。
>>> import example
这不会example直接在当前符号表中输入定义的功能名称。它仅在example此处输入模块名称。
使用模块名称,我们可以使用点. 运算符访问函数。例如:
>>> example.add(4,5.5) 9.5
Python有大量可用的标准模块。
您可以查看的完整列表及其 用途。这些文件位于Python安装位置内的Lib目录中。
可以像导入用户定义的模块一样导入标准模块。
有多种导入模块的方法。它们列出如下。
我们可以使用import语句导入模块,并如上所述使用点运算符访问其内部的定义。这是一个实例。
# 导入语句示例 # 导入标准模块数学 import math print("π的值", math.pi)
运行该程序时,输出为:
π的值 3.141592653589793
我们可以通过如下重命名导入模块。
# 通过重命名导入模块 import math as m print("π的值", m.pi)
我们已将math模块重命名为m。在某些情况下,这可以节省我们的书写时间。
请注意,该名称math在我们的范围内无法识别。因此,math.pi无效的,而m.pi是正确的使用方式。
我们可以从模块导入特定名称,而无需整体导入模块。这是一个实例。
# 从数学模块仅导入pi from math import pi print("π的值", pi)
我们仅从模块导入属性pi。
在这种情况下,我们不使用点运算符。我们可以如下导入多个属性。
>>> from math import pi, e >>> pi 3.141592653589793 >>> e 2.718281828459045
我们可以使用以下构造从模块导入所有名称(定义)。
# 从标准模块math中导入所有名称 from math import * print("pi的值", pi)
我们从数学模块中导入了所有定义。这使得除带下划线的beginnig之外的所有名称在我们的范围内可见。
导入带有星号(*)符号的所有内容都不是一种好的编程习惯。这可能导致标识符重复定义。这也会影响我们代码的可读性。
导入模块时,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。
# 该模块显示了 # 多个导入并重新加 print("这段代码被执行了")
现在我们看到了多次导入的效果。
>>> import my_module 这段代码被执行了 >>> import my_module >>> import my_module
我们可以看到我们的代码只执行了一次。这说明我们的模块仅导入了一次。
现在,如果我们的模块在程序执行过程中发生了变化,我们将不得不重新加载它。一种方法是重启解释器。但这并没有太大帮助。
Python提供了一种简洁的方法。我们可以使用模块reload()内部的函数imp来重新加载模块。这是怎么做的。
>>> import imp >>> import my_module 这段代码被执行了 >>> import my_module >>> imp.reload(my_module) 这段代码被执行了 <module 'my_module' from '.\\my_module.py'>
我们可以使用dir()函数找出在模块内部定义的名称。
例如,我们在开始的模块example中定义了一个add()函数。
>>> 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']