学径 LearnPath

编程语言基础 / Wiki

模块

一份可复用的 Python 代码仓库,用 import 引入当前程序;其中通常装着函数、类和常量。

它是什么

模块 是一份已经写好的 Python 代码,里面通常装着 函数、类 和常量。不必把数学公式、随机数、画图工具从零实现,用 import 把模块接到当前程序即可。这是 抽象 的又一层:当前这一页只处理当前的问题,共用的能力放在可替换的单元里。

python
import math
import random

print(math.sqrt(2))
print(random.randint(1, 6))

标准库随 Python 提供;第三方库由社区发布。浏览器中的解释器环境通常能使用标准库以及该环境提供的 turtle 等模块。引入只是把工具准备好,并不会自动开始计算或自动开始画图。

名字从哪来

module 来自建筑和工程里的「模块」:相对独立的一块,插上就能工作。1960 年代起,人们强调把大程序切成可替换的单元,这叫模块化。文件常常对应一个模块,扩展名是 .py,模块名一般就是文件名去掉后缀。import 的本义是「进口、引入」。as 用来起一个更短的本地名字,例如 import math as m。

抄一段别人的函数到自己的文件里,和 import 不是一回事。后者保持一份来源,修正时只改一处。模块化要解决的,正是「同一规则出现许多份副本」时无法证明它们仍是同一条规则。

它怎么工作

import math 让解释器找到 math 这份代码,执行其中的定义,并把结果绑到名字 math 上。之后用 math.sqrt 这样的点号去取里面的对象,避免和自己的函数抢名字。from math import sqrt 则把 sqrt 直接放进当前命名空间。省事,但容易和本地名字冲突。完整的 math.sqrt 更不容易迷路。

同一份模块在一次运行里通常只加载一次。也可以把一组相关函数写成一个文件,当作模块导入——前提是运行环境找得到这个文件。自己的文件若取名 math.py,可能挡住标准库的 math,让真正的数学函数找不到。不要用标准库的名字给自己的程序命名。

生活里在哪里

工具箱里尺子与圆规分开放,用哪件取哪件。实验室的标准试剂不必每次自己合成。说明书中的「参见某章」把共用部分放到一处。这些类比里,模块提供的是可检验的复用:不是把文字复制一遍,而是指向同一份来源。对话式编程若把生成出的整段库代码反复粘贴进许多文件,修正一处漏洞就要改许多份,边界会迅速失控。见 对话式编程。

和相近概念的差别

模块是仓库。函数是仓库里的一件工具。可以只用其中几个。文件 也可以存数据;模块文件存的是可执行的定义。用 import 加载的是代码,用 open 读取的是内容。类可以放在模块里,但模块不必只有一个类。

常见误会

误会 1:import 了就会自动开始画图或自动开始计算。

引入只是把工具准备好。要调用,还得写函数名和括号。

误会 2:模块里的名字可以直接当本地变量用。

import math 之后应写 math.pi,不是 pi,除非使用了 from math import pi。

误会 3:自己的文件叫 math.py 也没关系。

可能挡住标准库的 math。不要用标准库的名字给自己的程序命名。

想知道更多

  • 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》
  • 书:布鲁克希尔《计算机科学概论》
  • 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》

未登录时不会保存学习进度