Maya 要在牛奶标签上打明天的日期,还想算一个分小费的平方根。标准库两样都有,她却一直在手写。import 到底把什么带进了这个文件?
模块就是一个可以复用的 Python 代码文件。标准库随 Python 一起安装,涵盖数学、统计、随机数、日期等大量功能。import 会让这些名字在你的程序里可用。 你还会看到导入缓存、显式命名空间和主入口保护。
导入整个模块
import math 会加载模块,并把它的名字放在 math 命名空间里。调用 math.sqrt 而不是直接写 sqrt,读者能看出函数来自哪里,也不容易和自己的变量重名。
import math
print(math.sqrt(81))
print(math.pi)名字留在模块里
只导入需要的名字
from statistics import mean 会把一个名字带入当前命名空间。名字含义明确时,这种写法很简洁。实际代码中避免 from module import *:它会隐藏名字的来源,还可能覆盖已有变量。
from statistics import mean, median
scores = [7, 9, 10]
print(mean(scores))
print(median(scores))有针对性的导入
别名与 random 模块
模块名很长,或社区有约定俗成的短名时,可以用别名。import random as rnd 仍然加载整个模块,只是通过 rnd 访问。需要重复运行时,先给随机数生成器设置种子。
import random as rnd
rnd.seed(7)
print(rnd.choice(["latte", "tea", "mocha"]))简短的别名
导入会被缓存
Python 每个进程只加载一次模块,并把它存进 sys.modules。第二次 import 绑定的是同一个模块对象,不会重新执行文件。这既解释了模块级状态为何共享,也说明昂贵初始化该放进函数或主入口保护。
import math
import math as m
import sys
print(math is m)
print("math" in sys.modules)
print(math.sqrt(16))别名指向同一个模块对象
显式命名空间避免重名
import statistics 会把 mean 留在模块命名空间里,本地变量 mean 不会覆盖它。from statistics import mean 更短,但会把名字放进当前命名空间。选择能让名字来源更清楚的那种写法。
import statistics
mean = 10
print(mean)
print(statistics.mean([1, 2, 3]))本地变量不会覆盖模块
主入口保护把导入和执行分开
文件被直接运行时,__name__ 是 __main__;被导入时,__name__ 是模块名。把演示或命令行入口放进 if __name__ == "__main__":,导入时就只会定义名字,不会启动程序。
def main():
print("program starting")
if __name__ == "__main__":
main()
print("module name:", __name__)导入不应该启动程序
本课要点
- import module 会把名字保留在模块命名空间中。
- from module import name 会把一个名字带入当前文件。
- 别名改变的是访问方式,不是模块本身。
- 优先使用明确的导入,而不是通配符导入。
- 导入会缓存;主入口保护避免导入时产生副作用。
常见错误
- 没有导入就直接调用 sqrt,或忘记写 math. 前缀。
- 使用 from math import *,导致看不清名字来源。
- 没有设置种子,却以为 random 每次都会给出相同结果。
- 在模块导入时直接运行报告,让每个调用方都意外执行。
导入 math 和 statistics,打印 16 的平方根以及 [2, 4, 6] 的平均值。
动手试试
改改变量、先预测输出,再运行代码。第一次点击“运行代码”时会下载 Python 运行时,可能需要几秒钟。
练习本课
12 道题,作答后立即看到解释。