什么是模块?如何创建模块?
一旦在 Python 解释器中定义了函数,就可以调用任意次数。但是,这些函数定义在退出解释器时会丢失。
为了解决这个问题,我们可以创建一个 Python 脚本,在文件开头包含函数定义,然后是包含调用已定义函数语句的其余代码。
但是,这个过程很繁琐且不易管理,因为用户定义函数的强大之处在于程序员可以 - 编写一次,多次使用 (Write once, and use many times)。
与其为每个新程序一遍又一遍地重复函数定义,不如将所有函数定义放在一个文件中,然后可以从该文件导入所需的函数,并在脚本模式或交互模式下调用。
这个文件(.py
扩展名)称为模块 (module),它是其他程序可以访问的最基本的可重用代码形式。
让我们创建一个包含以下函数的新文件 basics.py
:
#basics.py
def adder(f, s, t = None):
"""
返回 f, s 和 t 的和。
如果未提供 t,
则返回 f 和 s 的和。
"""
result = f + s
if t is not None:
result += t
return result
def tripler(a):
"""
将 a 乘以 3 并返回结果
"""
result = 3*a
return result
#可以在模块中定义全局变量
PI = 3.14159
保存 basics.py
文件后,重新打开 IDLE 并在与 basics.py 相同的目录中创建一个新文件 test.py
。
文件名就是模块名,它也可以在模块内部通过全局变量 __name__
的值获得。
通过执行以下语句将 basics 模块的函数导入 test.py
。
import basics
上面的 import
语句加载了 basics
模块中所有可用的函数和变量。要访问模块中的任何函数或变量,只需键入模块名称,后跟一个句点 (.
),再后跟函数或变量名称。
代码 (test.py)
import basics
sa = basics.adder(20, 10, 10)
st = basics.tripler(20)
print("Sum:", sa)
print("Triple:", st)
print("PI from basics:", basics.PI)
输出
Sum: 40
Triple: 60
PI from basics: 3.14159
也可以使用 as
关键字创建别名,这使得在程序中使用起来更简单、更易于管理。
代码 (test.py)
import basics as ba # 使用别名 ba
sa = ba.adder(20, 10, 10)
st = ba.tripler(20)
print("Sum:", sa)
print("Triple:", st)
print("PI from basics alias:", ba.PI)
输出
Sum: 40
Triple: 60
PI from basics alias: 3.14159
可以使用 from
语句仅访问指定的函数或变量,而不是加载模块中的所有内容。
代码 (test.py)
from basics import adder, PI # 只导入 adder 函数和 PI 变量
sa = adder(20, 10, 10)
print("Sum:", sa)
print("PI directly:", PI)
#st = tripler(20) # 这会报错,因为 tripler 没有被导入
输出
Sum: 40
PI directly: 3.14159
可以使用 *
通配符导入模块中的所有函数和全局变量。
代码 (test.py)
from basics import * # 导入所有内容
sa = adder(20, 10, 10)
st = tripler(20)
print("Sum:", sa)
print("Triple:", st)
print("PI directly:", PI)
输出
Sum: 40
Triple: 60
PI directly: 3.14159
不推荐使用 *
导入模块内容的方法,因为它会污染命名空间(将模块中的所有名称引入当前作用域),并可能导致程序员定义的标识符与模块/包中定义的标识符之间发生冲突。