👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
(3 小时直播脚本 + 课后练习)
──────────────────
0. 开场(5 min)
• 一句话定位:今天之后,你将能“用 Python 的方式”优雅地遍历大文件、流式处理数据,并写出可复用的惰性计算库。
• 课程节奏:45 min 概念 → 30 min 代码实操 → 15 min 调试技巧 → 60 min 综合案例 → 20 min 总结 & 作业 → 10 min Q&A。
──────────────────
- 温故:for-loop 背后到底发生了什么?(10 min)
代码对比:提问:为什么文件对象1
2
3
4
5
6
7
8
9
10
11lst = [1, 2, 3]
for x in lst: # 语法糖
print(x)
it = iter(lst) # 等价展开
while True:
try:
x = next(it)
print(x)
except StopIteration:
breakopen()
可以for line in f:
?
→ 引出“迭代器协议”。
──────────────────
2. 迭代器协议解剖(15 min)
2.1 协议定义
- 可迭代对象:
__iter__
返回迭代器 - 迭代器对象:
__iter__
返回自身 +__next__
抛StopIteration
2.2 手写一个 Fibonacci 迭代器(现场编码)
1 | class Fib: |
运行验证:
1 | list(Fib(10)) |
──────────────────
3. 生成器函数:更轻量的迭代器(15 min)
3.1 语法糖
1 | def fib(n): |
对比:代码量 ↓ 80%,状态机由 Python 代管。
3.2 双向通信:send
/throw
/close
现场演示:
1 | def gen(): |
3.3 生成器表达式
1 | squares = (x * x for x in range(10**8)) # 惰性 |
──────────────────
4. 代码实操:重构“逐行读大文件”脚本(30 min)
需求:10 GB 日志文件,提取包含 ERROR 的行并写入新文件。
4.1 原始写法(内存爆炸):
1 | with open('big.log') as f: |
4.2 惰性迭代器版:
1 | def error_lines(path): |
4.3 进阶:用 itertools.islice
截断前 100 条
1 | from itertools import islice |
──────────────────
5. 调试技巧:生成器断点 & 可视化(15 min)
- PyCharm 断点:在
yield
行可单步查看局部变量。 reprlib.repr()
打印大对象不卡死。sys.getsizeof
对比列表 vs 生成器内存占用:1
2
3import sys
sys.getsizeof([x for x in range(1000000)]) # 约 8 MB
sys.getsizeof((x for x in range(1000000))) # 约 120 B
──────────────────
6. 综合案例:实时日志监控器(60 min)
需求:对持续写入的日志文件,实时输出 ERROR 行并统计数量。
技术栈:生成器 + tail -f
模拟 + asyncio
(预告下一章)。
6.1 实现 tail
生成器
1 | import time |
6.2 聚合统计
1 | from collections import Counter |
6.3 打包成 CLI 工具(typer 快速演示,为第 9 章埋点)。
──────────────────
7. 总结 & 思维导图(5 min)
迭代器协议 → 生成器函数 → 惰性计算 → 内存友好 → 流式架构。
──────────────────
8. 课后练习
- 必做:把今天的
tail
生成器改成支持 gzip 压缩日志(提示:gzip.open
也实现了迭代器协议)。 - 选做:用生成器写一个“无限滑动平均”函数,输入任意数字序列,输出实时平均。
- 思考题:为什么
list(iterator)
会耗尽迭代器?如何实现“可重置”的迭代器?
提交方式:
- 代码 push 到 GitHub Classroom 指定仓库;
- CI 会自动跑测试 & 内存基准测试(使用
pytest-benchmark
)。
──────────────────
9. 下集预告
第 2 章装饰器:把今天的 tail
监控器加上 @retry
、@rate_limit
等可插拔能力。
(完)
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利