随着我们的程序规模不断增大,代码行数可能会非常多。与其将所有内容都放在一个文件中,不如使用模块(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
Python 导入时重命名模块
在 Python 中,我们也可以在导入模块时为其重命名。例如:
# 通过重命名导入模块
import math as m
print(m.pi)
# 输出: 3.141592653589793
在这里,我们将 math 模块重命名为 m。在某些情况下,这可以减少我们的输入量。
请注意,此时名称 math 在当前作用域中不再被识别。因此,math.pi 是无效的,而 m.pi 才是正确的用法。
Python 的 from...import 语句
我们可以从模块中只导入特定的名称,而不导入整个模块。例如:
# 仅从 math 模块导入 pi
from math import pi
print(pi)
# 输出: 3.141592653589793
在这里,我们只从 math 模块中导入了 pi 属性。
导入所有名称
在 Python 中,我们可以使用以下结构从一个模块导入所有名称(定义):
# 从标准模块 math 导入所有名称
from math import *
print("The value of pi is", pi)
在这里,我们导入了 math 模块中的所有定义。这包括当前作用域中所有可见的名称(以单下划线开头的私有定义除外)。
注意:使用星号(
*)符号导入所有内容并不是一种良好的编程实践。这可能导致标识符的重复定义,也会降低代码的可读性。
内置函数 dir()
在 Python 中,我们可以使用 dir() 函数列出模块中所有的函数名(以及其他名称)。
例如,前面我们在 example 模块中定义了一个 add() 函数。
我们可以按如下方式对 example 模块使用 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', 'pyscripter']