什么是模块?
想象一下,你正在写一个超长的 Python 程序,有几千甚至上万行代码,如果把所有代码都写在一个文件里,那将会是一场噩梦:难以阅读、难以维护、难以查找 bug。

模块 就是为了解决这个问题而生的,它就像是乐高积木中的“一块”。
- 定义:一个模块就是一个包含了 Python 定义和语句的
.py文件,文件名就是模块名(mymodule.py的模块名就是mymodule)。 - 作用:它将相关的代码(比如函数、类、变量)组织在一起,使你的代码结构更清晰,逻辑更分明。
核心思想:将大问题分解成小问题,每个小问题放在一个模块里解决。
为什么要使用模块?
- 代码组织化:将不同功能的代码(如网络操作、数据处理、UI界面)分别放在不同的模块中,让项目结构一目了然。
- 代码复用:你可以创建一个模块,然后在多个不同的程序中导入并使用它,避免重复“造轮子”。
- 命名空间管理:模块可以防止命名冲突,你可以在你的
utils.py模块里定义一个process_data函数,也可以在另一个analysis.py模块里定义另一个同名的process_data函数,它们互不干扰。 - 协作开发:在一个团队中,不同的开发者可以负责不同的模块,最后再将它们组合起来,大大提高了开发效率。
如何创建和使用模块?
创建模块非常简单,你只需要创建一个 .py 文件,并在里面写代码即可。
示例:创建一个模块
假设我们正在开发一个项目,需要一个处理数学运算的工具模块,我们创建一个名为 math_utils.py 的文件:

math_utils.py
# 这是一个模块文件
# 定义一个变量
PI = 3.14159
# 定义一个函数
def add(a, b):
"""这个函数用于计算两个数的和"""
print(f"正在计算 {a} + {b}")
return a + b
# 定义另一个函数
def circle_area(radius):
"""这个函数用于计算圆的面积"""
print(f"正在计算半径为 {radius} 的圆的面积")
return PI * radius ** 2
# 定义一个类
class Calculator:
"""一个简单的计算器类"""
def __init__(self, name):
self.name = name
print(f"{self.name} 计算器已就绪!")
def multiply(self, x, y):
return x * y
示例:使用模块
我们创建另一个主程序文件 main.py,来使用上面创建的 math_utils.py 模块。
main.py
# 导入我们刚刚创建的模块
import math_utils
# --- 使用模块中的变量 ---
print(f"模块中的 PI 值是: {math_utils.PI}")
# --- 使用模块中的函数 ---
sum_result = math_utils.add(10, 5)
print(f"计算结果是: {sum_result}")
area_result = math_utils.circle_area(10)
print(f"圆的面积是: {area_result}")
# --- 使用模块中的类 ---
my_calc = math_utils.Calculator("智能")
multiply_result = my_calc.multiply(7, 8)
print(f"乘法计算结果是: {multiply_result}")
运行 main.py 的输出:

模块中的 PI 值是: 3.14159
正在计算 10 + 5
计算结果是: 15
正在计算半径为 10 的圆的面积
圆的面积是: 314.159
智能 计算器已就绪!
乘法计算结果是: 56
解释 import math_utils 的工作原理:
当 Python 执行到 import math_utils 时,它会做以下几件事:
- 在 Python 的搜索路径(包括当前目录)中寻找名为
math_utils.py的文件。 - 如果找到,就会执行这个文件里的所有代码,这意味着
math_utils.py里的所有函数定义、类定义和变量赋值都会被执行一次。 - 创建一个名为
math_utils的命名空间,并将文件中定义的所有名称(如add,PI,Calculator)放入这个命名空间。 - 在当前程序中,你可以通过
模块名.名称的方式(如math_utils.add)来访问这些内容。
模块的几种导入方式
除了上面最基本的 import 语句,Python 还提供了其他几种灵活的导入方式。
from ... import ...
这种方式可以从一个模块中导入特定的函数、变量或类,使用时不需要加上模块名前缀。
# 从 math_utils 模块中只导入 add 函数和 PI 变量
from math_utils import add, PI
# 直接使用,不需要 math_utils. 前缀
result = add(20, 30)
print(f"结果是: {result}")
print(f"PI 值是: {PI}")
# 这样会报错,因为 Calculator 没有被导入
# my_calc = Calculator("XXX") # NameError: name 'Calculator' is not defined
from ... import *
这种方式会导入模块中除了以下划线 _ 开头之外的所有名称。强烈不推荐在大型项目中使用这种方式,因为它会污染当前的命名空间,可能导致难以发现的命名冲突。
# 导入 math_utils 中的所有名称
from math_utils import *
# 现在可以直接使用所有名称
sum_result = add(5, 3)
print(f"结果是: {sum_result}")
my_calc = Calculator("另一个")
使用 as 给模块或名称起别名
当模块名很长或者容易与其他名称冲突时,可以使用 as 给它起一个简短的别名。
# 1. 给整个模块起别名
import math_utils as mu
print(mu.PI)
area = mu.circle_area(5)
print(f"面积是: {area}")
# 2. 给导入的名称起别名
from math_utils import circle_area as calculate_area
# 现在使用 calculate_area 代替 circle_area
area2 = calculate_area(7)
print(f"另一个面积是: {area2}")
Python 的标准库
Python 自带了一个强大的标准库,里面包含了大量预置的模块,用于处理各种常见任务,
os: 与操作系统交互(如文件、目录操作)。sys: 与 Python 解释器交互(如获取命令行参数)。datetime: 处理日期和时间。json: 用于 JSON 数据的编码和解码。random: 生成随机数。requests: (虽然是第三方库,但几乎是事实上的标准) 用于发送 HTTP 请求。
示例:使用 random 模块
import random
# 生成一个 1 到 100 之间的随机整数
number = random.randint(1, 100)
print(f"你抽中的幸运数字是: {number}")
# 从一个列表中随机选择一个元素
fruits = ['apple', 'banana', 'cherry']
fruit = random.choice(fruits)
print(f"今天的水果是: {fruit}")
模块的搜索路径
当你 import 一个模块时,Python 会在哪里寻找它?Python 会按照一个特定的顺序搜索以下位置:
- 当前目录:首先在执行脚本的当前目录下查找。
- 环境变量
PYTHONPATH:如果设置了PYTHONPATH,Python 会在这些指定的路径中查找。 - 标准库路径:在 Python 安装目录下的标准库路径中查找。
- 第三方库路径:在
site-packages目录中查找(这是pip安装包的地方)。
你可以通过 sys.path 来查看 Python 的所有搜索路径:
import sys print(sys.path)
__name__ 属性:模块的“身份证”
这是一个非常重要且常用的概念,每个 Python 模块都有一个内置的 __name__ 属性。
- 当一个模块被直接运行时(比如在终端里执行
python my_module.py),它的__name__属性的值是字符串'__main__'。 - 当一个模块被其他模块导入时(
import my_module),它的__name__属性的值是模块的名字(字符串'my_module')。
用途:这个特性通常用来在模块中编写测试代码,这样,当你直接运行模块时,测试代码会执行;但当你导入这个模块到其他程序中时,测试代码不会被执行,避免干扰。
修改 math_utils.py:
# math_utils.py
PI = 3.14159
def add(a, b):
return a + b
# 这段代码只有在 math_utils.py 被直接运行时才会执行
if __name__ == '__main__':
print("这个模块正在被直接运行!")
print("我们来测试一下 add 函数:")
print(add(2, 3))
print("测试结束。")
测试:
-
直接运行
math_utils.pypython math_utils.py
输出:
这个模块正在被直接运行! 我们来测试一下 add 函数: 5 测试结束。 -
从
main.py导入math_utils# main.py import math_utils print("main.py 正在运行...") print(math_utils.add(10, 20))输出:
main.py 正在运行... 30你会发现,
math_utils.py中的if代码块没有执行。
| 概念 | 描述 | |
|---|---|---|
| 模块 | 一个 .py 文件,包含相关的代码(函数、类、变量)。 |
文件、组织、.py |
| 导入 | 使用 import 语句在其他程序中使用模块的功能。 |
import, from, as |
| 标准库 | Python 自带的模块集合,功能强大。 | os, sys, random |
__name__ |
一个特殊变量,用于区分模块是被直接运行还是被导入。 | if __name__ == '__main__' |
sys.path |
Python 查找模块的路径列表。 | 搜索路径、pip |
掌握模块是编写结构良好、可维护、可扩展的 Python 程序的基石,从现在开始,尝试将你的代码按照功能划分到不同的模块中吧!
