一、什么是 Python 模块?
在 Python 中,一个 .py 文件就是一个模块(Module)。
- • 代码复用:把常用功能写成单独文件,其他地方直接导入。
- • 代码管理:几千行代码拆分成多个文件,更容易维护。
- • 包管理:多个模块组成包(Package),方便组织大型项目。
二、模块导入的四种方式
1. import 模块名(最常用)
导入整个模块,使用时必须加模块名前缀。
语法:
import 模块名
示例:导入标准库 math
import math
print(math.pi) # 调用模块内的变量
print(math.sqrt(16)) # 调用模块内的函数
优点:
2. from 模块名 import 成员(导入指定成员)
从模块中直接导入特定的函数/变量/类,使用时不用加模块名前缀。
语法:
from 模块名 import 函数名, 变量名
示例:
from math import pi, sqrt
print(pi) # 直接使用
print(sqrt(16))
优点:
缺点:
- • 容易冲突:如果内部有同名变量,会覆盖模块成员。
3. from 模块名 import *(导入全部成员)
一次性导入模块所有成员,极度不推荐!
语法:
from math import *
示例:
from math import *
print(pi)
print(cos(0))
❌ 严重缺点:
- • 命名冲突:如果你的变量名和模块内的同名,会被直接覆盖。
4. import ... as ...(别名导入)
给模块或成员起别名,解决长名或冲突问题。
语法1:给模块起别名
import 模块名 as 别名
示例:
import datetime as dt
print(dt.datetime.now())
语法2:给成员起别名
from math import sqrt as square_root
示例:
from math import sqrt as sq
print(sq(25)) # 5
优点:
三、name == "main" 的作用(核心重点)
这是 Python 中最经典的语法糖,几乎每个 Python 文件都会用到。
1. 核心原理
- •
__name__ 是 Python 内置的特殊变量。 - • 当 直接运行 某个
.py 文件时,Python 解释器会自动把 __name__ 设为字符串 "__main__"。 - • 当 被导入 其他文件使用时,
__name__ 会变成模块的名字(文件名)。
2. 作用一:测试代码(入口)
让文件既能作为模块导入,又能独立运行测试代码。
示例:
假设我们有一个文件 utils.py
# utils.py
defadd(a, b):
return a + b
# 👇 核心代码
if __name__ == "__main__":
# 这里的代码,只有直接运行 utils.py 时才会执行
print("开始测试 add 函数")
print(add(1, 2)) # 3
print("测试结束")
情况 A:直接运行 utils.py
开始测试 add 函数
3
测试结束
情况 B:在另一个文件 main.py 中导入
# main.py
import utils
print(utils.add(10, 20)) # 30
运行 main.py,不会执行utils.py 里的 if __name__ == "__main__": 块。
输出只有:
30
3. 作用二:模块安全隔离
防止导入时执行不必要的初始化代码或测试代码,保证模块只作为功能提供者,而不是运行入口。
四、导入路径与查找顺序(进阶)
Python 导入模块时,会按以下顺序查找:
- 3. Python 标准库目录(如 math, os 等)
- 4. 第三方库安装目录(site-packages)
查看路径
import sys
print(sys.path)
动态添加路径
import sys
sys.path.append("/path/to/your/module/folder")
import my_module
五、常见易错点总结
易错1:导入时写错模块名
- • 区分大小写!
import Math 不同于 import math - • 不要把
.py 后缀写进去!import math.py 是错的。
易错2:使用 from ... import *
- • 强烈不推荐。尽量用
import 模块名 或 from 模块名 import 成员。
易错3:循环导入
- • 模块 A 导入 B,模块 B 又导入 A → 报错。
易错4:__name__ 拼写错误
- • 写成
name == "main" 会永远为 False,代码永远不执行。
📚 综合练习题(带详细讲解)
练习1:import 与 from...import 区别
写出以下代码的运行结果,并解释原因。
# module_a.py
x = 100
deffunc():
print("来自 module_a 的 func")
# main.py
from module_a import x
import module_a
print(x)
print(module_a.x)
module_a.func()
答案:
100
100
来自 module_a 的 func
讲解:
- •
from module_a import x 把全局变量 x 导入当前命名空间。 - •
import module_a 导入整个模块,模块内的 x 仍然存在。
练习2:name == "main" 用法
以下代码分别在直接运行和被导入时,输出有什么不同?
# test.py
print("文件开始执行")
if __name__ == "__main__":
print("我是主程序")
else:
print("我被导入了")
print("文件结束执行")
答案:
直接运行 test.py
文件开始执行
我是主程序
文件结束执行
在另一个文件中 import test
文件开始执行
我被导入了
文件结束执行
讲解:
- • 直接运行时,
__name__ 是 "__main__",执行 if 块。 - • 被导入时,
__name__ 是 "test",执行 else 块。
练习3:as 别名用法
用别名简化模块调用。
import datetime as dt
current_time = dt.datetime.now()
print(current_time.strftime("%Y-%m-%d %H:%M:%S"))
讲解:
- • 给
datetime 模块起别名 dt,代码更简洁。
📝 本章超级总结
模块导入
- 1.
import 模块名:最推荐,完整清晰,不污染命名空间。 - 2.
from 模块名 import 成员:简洁,适合高频成员。 - 3.
from 模块名 import *:❌ 绝对不要用。 - 4.
import ... as ...:给长模块/成员起别名,解决冲突。
name == "main"
- 1. 直接运行文件时,
__name__ 为 "__main__"。 - 3. 核心用途:写测试代码入口,保证文件既可导入又可独立运行。