这套课程按知识依赖排列。本篇的前置知识是:第 22、25 篇。学完后,你应该能够把函数拆到不同文件并控制脚本入口。
本篇要解决的问题
本篇只处理“模块、import 与 name”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。
先看清一个容易误解的细节
同一个文件直接运行时 __name__ 等于 "__main__";被其他文件导入时,它等于模块名。入口判断可以避免导入时自动执行演示代码。
核心概念
- 一个
.py文件就是一个模块。 - 导入时模块顶层代码会执行一次,因此顶层应以定义和常量为主。
- 避免使用
from module import *,它会让名字来源不清楚。
跟着示例运行
先在同一个目录中创建两个文件。把函数放进 calculator.py:
def add(left, right):
return left + right
if __name__ == "__main__":
print(add(2, 3))
再创建 app.py,从模块中导入函数:
from calculator import add
print(add(10, 20))
分别执行 python3 calculator.py 和 python3 app.py。
预期结果:
直接运行 calculator.py 输出 5;运行 app.py 输出 30
输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。
按执行顺序拆开看
- 直接运行
calculator.py时,模块名是__main__,入口代码输出 5。 app.py导入模块时,calculator.py的函数定义会执行,但入口判断为假;随后app.py调用函数输出 30。
再看一个具体细节
同一个模块在“直接运行”和“被导入”两种方式下,入口判断结果不同。
两条路径都会建立函数定义;只有直接运行时才执行 __main__ 保护下的演示代码。
初学者容易混淆的地方
- 把两个示例文件粘成一个文件运行。应按注释分别保存为
calculator.py和app.py。 - 模块名与标准库或项目其他文件重名,例如命名为
json.py,导致导入目标被遮蔽。
练习
- 创建
text_tools.py并导出一个格式化函数。 - 分别直接运行模块和从另一个脚本导入,输出
__name__。
练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。
本篇边界
本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。
相关文章
01|Python 程序从源码到输出经历了什么
面向按顺序学习 Python 的初学者,本篇在零基础上,帮助读者理解源代码、解释器和输出之间的关系。
02|在 macOS 安装并确认 Python 3 环境
面向按顺序学习 Python 的初学者,本篇在第 01 篇知识上,帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。
03|交互式解释器和 Python 脚本怎么选择
面向按顺序学习 Python 的初学者,本篇在第 02 篇知识上,帮助读者根据任务选择 REPL 或 `.py` 脚本。
04|建立第一个 Python 项目目录
面向按顺序学习 Python 的初学者,本篇在第 03 篇知识上,帮助读者理解当前目录并正确运行项目脚本。

