Python生成器核心是暂停恢复机制与迭代器协议封装:yield让函数暂停并保存状态,next()时从断点继续;含yield的函数返回generator对象,支持惰性求值、管道处理和状态维持,但仅单次遍历。
Python生成器的核心原理,其实就两点:暂停恢复机制 + 迭代器协议封装。它不是什么黑魔法,而是对 __iter__ 和 __next__ 的自动化实现,配合 yield 让函数具备“记忆上次执行位置”的能力。
每次遇到 yield,函数就暂停,把值交出去,状态(局部变量、执行位置)全保留在栈帧里;下次调用 next() 或进入 for 循环时,从 yield 下一行继续执行。函数不会重新开始,也不会自动结束——直到遇到函数末尾或显式 return(返回的值仅作 StopIteration 的 value 属性,不可被迭代到)。
写法类似 (x*2 for x in range(10) if x % 2 == 0),外层是圆括号。它不构建完整列表,只在每次 next 时算一个值,内存占用恒定 O(1),适合处理大序列或无限流。
(y for x in data for y in x) 实现扁平化别只盯着“节省内存”,要关注它如何简化代码结构和解耦数据生产与消费逻辑。
filter_odd(gen()) | map_square()
| take(5),每个环节只关心自己的输入输出,天然支持流式处理gen.send(value) 向生成器传参,配合 yield 接收,就能实现双向通信——这是 asyncio 协程的底层基础之一很多问题源于混淆“生成器对象”和“生成器函数”,或者误以为 yield 能像 return 一样随意控制流程。
itertools.chain 等工具组合return value 不会返回这个 value 给调用者,而是让 StopIteration 异常带出 value(可通过 exc.value 获取),for 循环会静默忽略它