Python 编程与自动化:从语法到脚本与自动化工具
0. 元信息
- 主题:Python 编程与自动化:从语法到脚本与自动化工具
- 主题路径:
docs/topics/lang-python/README.md - 主分类:编程语言
- 辅助分类:工程技术(脚本、测试与发布)
- 适合对象:零基础或只会简单命令行操作的学习者
- 建议周期:8~12 周(每周 8~12 小时,含编码、测试与复盘)
- 前置知识:会使用命令行、能安装软件、能使用文本编辑器;直接前置主题为
linux-dev-env - 最终目标:能独立设计、测试、打包并交付一个可复现运行的命令行批量文件或数据处理工具
1. 学习路线
解释器与开发环境
→ 变量、类型、控制流与函数
→ 模块、包与可读代码
→ list/tuple/dict/set 与推导式
→ class、继承与魔术方法
→ pathlib、json/csv、itertools/functools、logging
→ unittest/pytest 与异常边界
→ pyproject.toml、venv、wheel 与发布
→ 命令行批处理/数据处理综合项目
每一步都是下一步的前置;不要同时追逐多个框架,先用标准库把问题做完。
2. 阶段周数分配
| 阶段 | 8 周方案 | 12 周方案 | 备注 |
|---|---|---|---|
| 1. 环境与解释器 | 0.5 周 | 1 周 | 解释器、venv、pip、编辑器 |
| 2. 语法基础 | 1.5 周 | 2 周 | 类型、控制流、函数、模块、包 |
| 3. 数据结构 | 1 周 | 1.5 周 | 容器、切片、推导式与复杂度 |
| 4. 面向对象 | 0.75 周 | 1 周 | class、继承、组合、魔术方法 |
| 5. 标准库与脚本 | 1.25 周 | 1.5 周 | 文件、序列化、迭代工具、日志 |
| 6. 测试与调试 | 0.75 周 | 1 周 | unittest/pytest、异常、可观测性 |
| 7. 打包与发布 | 0.5 周 | 0.5 周 | pyproject.toml、wheel、版本 |
| 8. 综合项目 | 1.75 周 | 3.5 周 | 从 CLI 原型到文档、测试、发布 |
| 合计 | 8 周 | 12 周 | 8 周高密度;12 周留复盘和返工时间 |
3. 八阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 环境与解释器 | CPython、PATH、REPL、脚本入口、venv、pip、IDE/编辑器 | hello.py、可激活的虚拟环境、requirements 记录 | 能解释系统 Python 与项目环境的区别,能在新目录创建并运行 venv;避免把全局 pip 当项目依赖 |
| 2. 语法基础 | int/float/str/bool/None、真值、运算符、if/for/while、函数、作用域、import、模块和包 | 温度转换、文件统计、可导入的多模块小程序 | 能独立写函数并说明参数/返回值;知道可变默认参数、局部变量和异常路径;循环复杂度不靠猜 |
| 3. 数据结构 | list、tuple、dict、set、切片、可变性、推导式、排序与键函数 | CSV/文本单词统计与去重报告 | 能按查找、顺序、唯一性选择容器;能预测常见操作平均复杂度;大数据不无意中复制多份列表 |
| 4. 面向对象 | class、实例/类属性、方法、继承、组合、__init__、__repr__、__iter__、比较与上下文管理 | 可测试的文件任务模型或 Todo 域模型 | 能用组合解决主要问题,只有确实需要多态时才继承;能解释魔术方法由谁调用;不把所有代码塞进 class |
| 5. 标准库与脚本 | os/sys/pathlib、json/csv、itertools/functools、logging、argparse、编码和资源管理 | 支持目录遍历、JSON/CSV 输入、日志和 dry-run 的 CLI 原型 | 能处理路径、编码、缺失文件、权限错误;知道 pathlib 优先于字符串拼路径,日志优先于散落 print |
| 6. 测试与调试 | unittest、pytest、断言、fixture、mock 基础、异常测试、调试器 | 核心转换/扫描逻辑的单元测试与边界清单 | 能测试空输入、非法参数、权限/编码失败;测试失败能定位到最小复现,而不是改测试迎合实现 |
| 7. 打包与发布 | pyproject.toml、构建后端、wheel、源码包、版本、入口点、依赖声明 | 可安装的 wheel 与命令行入口 | 能在干净 venv 安装 wheel 并运行;知道依赖、构建产物和源码的区别,不把本机路径写进包 |
| 8. 综合项目 | 需求、模块边界、CLI UX、数据安全、测试、文档、发布 | 一个可复现运行的批量文件/数据处理工具 | 第三方按 README 建环境、运行测试和示例都成功;作者能讲清取舍、限制和下一步 |
4. 第一周任务
开发约定
统一使用 Python 3.12+(教学代码避免依赖小版本特性时可运行于 Python 3.11+)。创建环境并运行:
python3 --version
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python script.py
python -m unittest discover
编辑器可选 VS Code、PyCharm Community 或任意支持语法检查和调试的编辑器;不要把 IDE 的“运行”按钮当成环境配置知识。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 安装 Python、确认 PATH;在 REPL 与脚本中运行 hello;创建 .venv 并记录激活/退出命令 | notes/week1.md:版本、命令、一次成功运行输出 |
| Day 2 | 变量、数字、字符串、布尔值、格式化字符串、输入与输出 | 温度/单位转换脚本,处理非数字输入 |
| Day 3 | if、for、while、range、break/continue、真值判断 | 目录后缀统计或单词计数脚本 |
| Day 4 | 函数、参数、返回值、作用域、类型注解与 docstring | 把 Day 2~3 拆成 3 个可测试函数 |
| Day 5 | list/dict、切片、推导式;模块导入与 if __name__ == "__main__" | 多文件数据清洗小程序 |
| Day 6 | pathlib 读取目录、异常处理、退出码;用编辑器断点调试 | 扫描指定目录并输出候选文件清单 |
| Day 7 | **步骤 A:**组合扫描、过滤、报告三个函数,读取 1 个正常目录并输出报告;运行 python -m unittest。**步骤 B:**补齐空目录、路径不存在、权限错误、非 UTF-8 文件四类边界/异常用例;记录实际输出 | 可运行 CLI 原型 + 测试记录;高强度检查可再运行 python -m compileall |
5. 阶段通用验收
- 不看答案独立重写每阶段的核心函数或类;
- 用自己的话解释该知识解决什么问题、为什么有效;
- 画一张数据流、对象关系或调用流程图;
- 测试空输入、最小值、最大值、非法输入和资源失败;
- 准备至少 3 组自定义数据并贴出实际输出;
- 记录关键操作的时间/空间复杂度,特别是容器查找、排序和文件遍历;
- 能修改已有程序(加参数、换输入格式、修 bug),而不是只能照抄;
- 依赖安装和测试必须在干净
.venv中重跑一次。
6. 最终验收
- 能独立使用 venv、pip 和编辑器完成项目环境配置;
- 能写出模块化 Python 程序,正确处理容器选择、异常、路径、编码和命令行参数;
- 至少完成 20 个小练习:语法/控制流 6 个,数据结构 5 个,文件与序列化 4 个,CLI/测试 5 个;至少 5 个包含异常或边界测试;
- 综合项目具备
pyproject.toml、测试、README、示例输入输出和 wheel; - 在全新虚拟环境执行安装、测试和示例命令成功;
- 能用 15 分钟讲清学习路线、一个关键设计取舍、复杂度和已知限制。
7. 综合项目
首选:命令行批量文件/数据处理工具(必做:输入目录或 CSV/JSON,输出处理结果;支持预览和安全失败)。
备选:CLI 版 Todo(本地 JSON 持久化)/ 爬虫(限于合法公开数据并遵守站点规则)/ 自动化部署脚本(必须 dry-run,禁止把密钥写入仓库)。
首选项目最低要求:
- 需求说明:目标用户、输入路径/格式、输出格式、覆盖与跳过规则;
- 数据结构选择理由:任务记录、路径集合和统计结果为何使用对应容器;说明复杂度;
- 核心算法说明:目录遍历、过滤、转换、写出流程,提供伪代码或 Mermaid 图;
- 模块化源码:
cli、业务逻辑、I/O、配置/日志分离,入口通过pyproject.toml声明; - 边界测试:空目录、重复文件、非法扩展名、不存在路径、权限错误、编码异常、dry-run 不写盘;
- 打包说明:构建 wheel,在干净 venv 安装并运行;
- README:安装、用法、示例输入输出、退出码、目录结构;
- 复盘记录:用时、难点、取舍、已知限制和下一步。
项目内建议保留 notes/design.md、notes/test.md、notes/retrospective.md,与项目代码一起交付。
8. 推荐开源资料
| 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|
| 官方入门 | Python 官方教程 | https://docs.python.org/3/tutorial/ | 主线学习语法与模块;PSF License,官方文档 |
| 官方查阅 | Python 标准库 | https://docs.python.org/3/library/ | 查 API、异常和行为;PSF License |
| 中文入门 | 廖雪峰 Python 教程 | https://liaoxuefeng.com/books/python/introduction/ | 用于概念补充,先核对当前 Python 版本 |
| 工程规范 | Python Packaging User Guide | https://packaging.python.org/ | 学 pyproject.toml、wheel、发布流程;文档 CC BY 4.0 |
| 测试 | pytest 文档 | https://docs.pytest.org/ | 阶段 6 查阅;MIT License |
| 源码对照 | Python 标准库 CPython | https://github.com/python/cpython | 先完成练习再挑标准库实现阅读;PSF License |
| 练习 | Exercism Python | https://exercism.org/tracks/python | 小题和反馈;平台内容按其仓库/题目许可执行 |
不要把教程收藏数量当学习进度;每份资料都要绑定一个可运行产出。
9. 学习资料汇聚(v0.3 自包含)
本节内容为本计划生成的整理;外部资料仅作学习入口和查询,不复制第三方教材。
9.1 背景与动机
- Python 由 Guido van Rossum 在 1989 年末开始设计,1991 年公开;语言强调可读性、快速反馈和丰富标准库。
- Python 通过解释器执行源代码,也可产生字节码并由虚拟机运行;它适合脚本、自动化、Web、数据处理和测试工具,但性能敏感路径可能需要优化或调用其他语言。
- 值得学习的原因是:同一套语言能连接文件系统、命令行、网络、数据格式和测试,能把重复劳动快速变成可复现工具。
9.2 概念地图
flowchart LR
Source[.py 源文件] --> Parser[解析与编译]
Parser --> Bytecode[字节码]
Bytecode --> VM[Python 虚拟机]
VM --> Runtime[对象与运行时]
Runtime --> Containers[list/dict/set]
Runtime --> Functions[函数与类]
Modules[模块/包] --> Source
Stdlib[标准库] --> Modules
CLI[argparse/入口点] --> Functions
Files[pathlib/json/csv] --> Functions
Tests[unittest/pytest] --> Functions
Build[pyproject.toml/wheel] --> Modules
关系说明:源文件经解释器解析后执行;对象、函数和容器构成程序核心;模块/包组织代码,标准库提供文件和数据能力;CLI 是用户入口,测试验证行为,构建系统把代码交付给其他环境。
9.3 基础知识讲解
主推(评分 4):Python 官方教程用于主线概念;Python 标准库文档用于逐项查阅。二者均为官方资料,适合以当前 Python 3 文档为准。
备查(评分 3~4):廖雪峰教程适合中文快速入门;Packaging User Guide 解决项目后半段的构建与发布;pytest 文档补充测试工作流。
缺失补足(由本计划生成):遇到一个新自动化需求时,先写“输入—转换—输出—失败行为”四格,再选标准库模块;先做能运行的函数,再加 CLI、日志和打包,避免一开始堆框架。
9.4 经典问题与经典案例
| # | 问题 | 为什么重要 | 最简答案 |
|---|---|---|---|
| 1 | 为什么脚本在 IDE 能跑、终端不能跑? | 解释器和 PATH 可能不同 | 用 python -c "import sys; print(sys.executable)" 核对实际解释器,并激活项目 venv |
| 2 | list、tuple、set、dict 怎么选? | 容器选错会让代码难读或变慢 | 有序序列用 list/tuple;唯一性用 set;键值查询用 dict;不变记录优先 tuple |
| 3 | is 与 == 有什么区别? | 身份判断错误会造成隐蔽 bug | == 比较值,is 比较是否为同一对象;单例 None 用 is None |
| 4 | 可变默认参数为何危险? | 默认 list 会跨调用保留状态 | 用 def f(items=None): items = [] if items is None else items |
| 5 | 相对路径为何失效? | 当前工作目录不一定是脚本目录 | 用明确的 pathlib.Path,必要时从参数或项目根目录解析 |
| 6 | 文本编码错误怎么办? | 文件处理工具最常见失败之一 | 明确编码契约,捕获 UnicodeDecodeError,给出路径和修复提示 |
| 7 | 为什么要用日志而不是到处 print? | 自动化任务需要等级、时间和可收集输出 | logging 负责诊断,CLI 输出负责用户结果 |
| 8 | 为什么要测试异常路径? | 文件不存在和权限失败才是脚本线上常态 | 用 assertRaises 或 pytest raises 验证失败类型和消息 |
| 9 | 为什么用 pyproject.toml? | 统一项目元数据、构建后端和入口点 | 在一个配置文件声明包信息、依赖和构建需求,再构建 wheel |
| 10 | “能跑”是否等于“可发布”? | 本机隐式依赖会让他人无法复现 | 干净 venv 安装 wheel、运行测试和 README 示例才算通过 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 名字、对象与可变性 | 变量不是装值的盒子,引用关系容易混淆 | 用 id()、浅拷贝和小列表画引用图;分别练 append 与重新绑定 |
| 迭代器与生成器 | 惰性求值看不到全部结果 | 先写 list 版本,再改为 yield,比较内存和执行时机 |
| 异常传播 | 不知道在哪一层捕获 | 只在能处理的位置捕获;边界层转为用户可理解的退出码 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 从手工步骤抽象成脚本 | 容易直接复制一次性命令 | 先写输入、规则、输出和重复条件,再函数化 |
| 容器与复杂度选择 | 语法简单掩盖了性能差异 | 为每次查找/插入标注平均复杂度,测小数据验证直觉 |
| 先设计失败行为 | 新手只设计 happy path | 每个函数至少补一个空输入和一个异常输入 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 环境可复现 | 系统解释器、IDE 和 pip 指向不同位置 | 每次记录 sys.executable,只在 venv 中安装项目依赖 |
| 模块导入与包布局 | 从任意目录运行时 import 失败 | 使用包结构和 python -m;不靠修改 sys.path 糊过去 |
| 测试与发布衔接 | 测试通过但 wheel 缺文件 | 在干净 venv 安装 wheel 后再跑测试和 CLI 示例 |
9.6 技术标准与接口
Entity
| 名称 | 版本/状态 | 发布组织 | 许可证/可访问性 |
|---|---|---|---|
| Python Language Reference | Python 3.12+ 文档 | Python Software Foundation | PSF License,公开在线 |
| Python Standard Library | 与解释器版本同步 | Python Software Foundation | PSF License,公开在线 |
| PEP 517/518/621 | 现行打包规范 | Python Packaging Authority 社区 | 授权公开,PEP 文档在线 |
| Wheel (PEP 427) | 二进制分发格式 | PyPA 社区 | 规范公开 |
Scope
- Python 语言参考定义语法、对象模型、异常和执行语义;标准库定义跨平台常用 API。
- PEP 517/518/621 约束构建后端、构建依赖和项目元数据;wheel 解决可安装分发,不等于源码仓库。
- Python 不保证每个 OS 的系统调用都一致;依赖 OS 的自动化应在
pathlib等抽象与明确平台说明之间取舍。
Structure
- 语言核心:表达式、语句、函数、类、模块、异常、上下文管理器。
- 标准库重点:
pathlib文件路径,os/sys进程和环境,json/csv数据交换,itertools/functools迭代与函数工具,logging日志,argparseCLI。 - 项目配置:
pyproject.toml的[build-system]、[project]、可选依赖和脚本入口;wheel 是安装产物。
Ecosystem
- CPython 是默认实现;PyPy 等实现可用于特定场景,但不要把实现细节误当语言保证。
- pip 是常用安装器,venv 是标准库虚拟环境工具;uv、Poetry 等是可选工具,不是本主题门槛。
- pytest 是事实标准测试框架之一;
unittest随 Python 提供,适合先理解测试基本模型。
Depth Tiers
| 层级 | 必须看到什么 |
|---|---|
| L0 | 知道 Python、CPython、pip、venv、wheel 和 PyPI 的角色 |
| L1 | 能读懂常见脚本、模块导入、容器和异常 |
| L2 | 能正确调用标准库、创建 venv、运行测试并构建 wheel |
| L3 | 能解释导入/环境/编码/异常问题,定位失败并修复 |
| L4 | 能为团队设计包边界、版本策略、兼容性和发布流水线 |
本计划要求综合项目达到 L3。
Source
- Python 官方文档:https://docs.python.org/3/
- Python Packaging User Guide:https://packaging.python.org/
- PEP Index:https://peps.python.org/
- 引用版本快照日期:2026-07-28。
10. 常见误区
- 把系统 Python 当作项目环境,导致依赖互相污染;
- 只会在 IDE 点击运行,不会从终端执行和传参数;
- 用
is比较普通值,或误解None的身份比较; - 使用可变默认参数造成跨调用状态泄漏;
- 用字符串拼接路径,忽略跨平台分隔符和当前工作目录;
- 捕获裸
except:,吞掉 KeyboardInterrupt 和真正的编程错误; - 为简单文件处理过早引入大型框架;
- 只写 happy path,不测空数据、权限、编码和不存在路径;
- 把日志、用户输出和调试 print 混为一谈;
- 误以为
pip freeze就是合理的项目依赖声明; - wheel 构建成功却没有在干净 venv 安装验证;
- 爬虫或部署脚本没有 dry-run、速率限制、密钥保护和失败回滚意识。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
本计划归属:编程语言(Python) 主;脚本自动化、测试与发布作为工程实践辅线。