python生成器的核心是惰性求值和状态保存,yield使函数变为可暂停、可恢复的迭代器工厂;调用返回生成器对象,每次next()从上次yield处继续执行并保留局部变量与状态。

Python生成器的核心是惰性求值和状态保存,yield不是简单地“返回一个值”,而是把函数变成一个可暂停、可恢复的迭代器工厂。
yield如何让函数变成生成器
当函数中出现yield语句,Python在编译时就将其标记为生成器函数。调用它不会执行函数体,而是立即返回一个生成器对象(generator object)。这个对象实现了迭代器协议(有__iter__和__next__方法)。
每次调用next()或进入for循环时,函数从上次yield暂停的位置继续执行,直到遇到下一个yield或函数结束。局部变量、执行位置、异常状态都会被保留。
适合用yield的典型场景
- 处理大数据流,避免内存爆炸:比如逐行读大文件、解析超长日志、实时接收网络数据包。不用一次性加载全部内容到列表,而是按需产出。
- 实现无限序列:如斐波那契数列、素数生成器、时间戳流。生成器可自然支持无限迭代,而普通函数无法返回无限列表。
-
分步计算与管道式处理:多个生成器可以链式调用(如
filter、map风格),每一步只处理一个元素,形成轻量级数据流水线。 - 替代回调或状态机逻辑:比如解析嵌套结构(JSON、XML)、协程式状态切换(早期async/await之前常用)。
yield和return的关键区别
return终止函数并丢弃所有上下文;yield暂停函数并冻结栈帧。一个生成器函数可以有多个yield,也可以带return(仅用于提前结束,并可附带返回值,该值会作为StopIteration.value被抛出)。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
注意:yield from不是语法糖,它将子生成器的控制权委托出去,能自动处理send()、throw()、close()等操作,常用于重构复杂生成器逻辑。
一个实用小例子:带缓冲的文件行读取
不直接用for line in f:,而是封装成可控批次的生成器:
def read_in_chunks(file_obj, chunk_size=1024):<br> while True:<br> data = file_obj.read(chunk_size)<br> if not data:<br> break<br> yield data
这样既节省内存,又比一行一行读更高效,还便于后续做分块处理(如哈希校验、加密、压缩)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










