大家好,我是正在实战各种 AI 项目的程序员晚枫。
处理 100 万条数据,内存只占用几 KB?构建数据处理管道,代码像流水线一样优雅?生成器让这一切成为可能!
🔄 生成器函数:yield 的本质
普通函数 vs 生成器函数
1 | import sys |
yield 的执行流程
1 | def step_by_step(): |
生成器表达式
1 | import sys |
📡 yield from:子生成器委托
基础用法
1 | def sub_generator(): |
嵌套结构扁平化
1 | from typing import Any, Iterator |
yield from 的值传递
1 | def accumulator(): |
🏭 数据处理管道:生成器的杀手级应用
生成器最强的应用场景之一:构建 惰性数据处理管道,每个阶段都是生成器,数据流式处理:
1 | import re |
🔧 itertools:生成器工具库
itertools 是 Python 标准库中的生成器工具集,全部是惰性的:
1 | import itertools |
💡 生成器协程:send 和 throw
生成器不仅能产出数据,还能通过 send() 接收数据,实现双向通信:
1 | def running_average() -> None: |
⚠️ 常见陷阱
1. 生成器只能遍历一次
1 | gen = (x**2 for x in range(5)) |
2. 忘记启动协程(执行到第一个 yield)
1 | def my_coroutine(): |
3. return 值在 StopIteration 中
1 | def gen_with_return(): |
🎯 本讲总结
生成器函数:用 yield 实现惰性求值,按需计算,节省内存。
生成器表达式:(expr for x in iterable) 是最简洁的创建方式。
yield from:委托子生成器,自动传递值/异常,支持嵌套递归。
数据管道:多个生成器串联,构建惰性处理流水线,适合大数据集。
itertools:标准库提供的惰性工具集,chain、islice、groupby 等是常用武器。
协程(生成器协程):send() 实现双向通信;asyncio 的协程就是基于此演化而来的。
关键区别:迭代器实现 __iter__/__next__;生成器是创建迭代器的便捷方式;协程是异步的基础。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
学习路线: 零基础 → 《从入门到实践》 → 《流畅的 Python》 → 本门课程 → 《CPython 设计与实现》
🎓 加入《流畅的 Python》直播共读营
学到这里,如果你想系统吃透这本书——欢迎加入我的直播共读课。
- 每周直播精讲,逐章拆解核心知识点
- 专属学习群,随时答疑交流
- 试运营特惠:
499 元→ 299 元
👉 【立即报名《流畅的 Python》共读课】:https://mp.weixin.qq.com/s/ivHJwn1nNx5ug4TFrapvGg
🔗 课程导航
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询
