Skip to content

什么是模块?如何创建模块?

一旦在 Python 解释器中定义了函数,就可以调用任意次数。但是,这些函数定义在退出解释器时会丢失。

为了解决这个问题,我们可以创建一个 Python 脚本,在文件开头包含函数定义,然后是包含调用已定义函数语句的其余代码。

但是,这个过程很繁琐且不易管理,因为用户定义函数的强大之处在于程序员可以 - 编写一次,多次使用 (Write once, and use many times)

与其为每个新程序一遍又一遍地重复函数定义,不如将所有函数定义放在一个文件中,然后可以从该文件导入所需的函数,并在脚本模式或交互模式下调用。

这个文件(.py 扩展名)称为模块 (module),它是其他程序可以访问的最基本的可重用代码形式。

让我们创建一个包含以下函数的新文件 basics.py

python
#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

python
import basics

上面的 import 语句加载了 basics 模块中所有可用的函数和变量。要访问模块中的任何函数或变量,只需键入模块名称,后跟一个句点 (.),再后跟函数或变量名称。

代码 (test.py)

python
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)

python
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)

python
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)

python
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

不推荐使用 * 导入模块内容的方法,因为它会污染命名空间(将模块中的所有名称引入当前作用域),并可能导致程序员定义的标识符与模块/包中定义的标识符之间发生冲突。