随着程序规模的增大,代码行数可能会变得非常多。与其将所有内容都放在一个文件中,不如使用模块(Module)将代码按功能拆分到不同的文件中。这样可以让我们的代码结构更清晰、更易于维护。
模块是一个包含用于执行特定任务的代码的文件。模块中可以包含变量、函数、类等。下面通过一个例子来说明:
创建模块
在文件中输入以下内容,并将其保存为 example.py:
# Python 模块:加法
def add(a, b):
result = a + b
return result
这里我们在名为 example 的模块中定义了一个函数 add()。该函数接收两个数字并返回它们的和。
在 Python 中导入模块
我们可以将一个模块中的定义导入到另一个模块或 Python 交互式解释器中。
使用 import 关键字即可实现导入。例如,要导入我们之前定义的 example 模块,在 Python 提示符中输入:
import example
这并不会将 example 模块中定义的函数名直接导入当前符号表,而只是将模块名 example 导入其中。
通过模块名,我们可以使用点号(.)操作符访问其中的函数。例如:
example.add(4, 5) # 返回 9
注意:
Python 自带大量标准模块。你可以查阅完整的 Python 标准库模块列表 及其用法。
标准库模块的导入方式与用户自定义模块完全相同。
导入 Python 标准库模块
Python 标准库包含 200 多个模块。我们可以根据需要导入相应的模块。
例如,如果我们想获取圆周率 π 的值,可以先导入 math 模块,然后使用 math.pi:
# 导入标准 math 模块
import math
# 使用 math.pi 获取 π 的值
print("The value of pi is", math.pi)
运行结果:
The value of pi is 3.141592653589793
使用别名导入模块(import ... as ...)
在 Python 中,我们还可以在导入模块时为其重命名。例如:
# 以别名方式导入模块
import math as m
print(m.pi)
# 输出: 3.141592653589793
这里我们将 math 模块重命名为 m,在某些情况下可以减少输入量。
注意:此时名称
math在当前作用域中不再被识别,因此math.pi是无效的,必须使用m.pi。
从模块中导入特定名称(from ... import ...)
我们可以只从模块中导入特定的名称,而不导入整个模块。例如:
# 仅从 math 模块导入 pi
from math import pi
print(pi)
# 输出: 3.141592653589793
这里我们只导入了 math 模块中的 pi 属性。
导入模块中的所有名称(from ... import *)
在 Python 中,可以使用以下语法导入模块中的所有名称(定义):
# 从标准模块 math 中导入所有名称
from math import *
print("The value of pi is", pi)
这会导入 math 模块中所有在当前作用域可见的名称(不包括以下划线开头的私有定义)。
注意:使用星号(
*)导入所有内容并不是良好的编程实践。这可能导致标识符重复定义,并降低代码的可读性。
使用内置函数 dir()
在 Python 中,我们可以使用 dir() 函数列出模块中所有的函数名和属性名。
例如,前面我们在 example 模块中定义了函数 add()。现在可以这样使用 dir():
print(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
print(dir())
# 输出可能包括: ['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', ...]