yield 关键词使函数变为生成器,返回生成器对象而非立即执行;2. 每次调用next()时从上次暂停处恢复执行并记住局部变量和指令位置;3. python通过pygenobject和pyframeobject在c层保存/恢复状态实现暂停与恢复;4. yield from委托子生成器,自动转发next/send/throw/close并捕获返回值,简化协作。这使得生成器具备记忆能力、低内存开销及高效协同特性,远超普通函数的一次性执行模式。
yield
yield
next()
yield
yield
生成器在底层,说白了,就是 Python 提供的一种高效、内存友好的迭代方式。它不像列表那样一次性把所有数据都加载到内存里,而是按需生成数据。这对于处理大量数据流、无限序列或者需要进行复杂计算但又不想一次性占用太多资源的情况,简直是神来之笔。
在我看来,生成器和普通函数最根本的区别在于它们的“生命周期”和“记忆能力”。普通函数一旦执行完毕,它的所有局部变量、执行上下文就都销毁了,下次再调用,一切从头开始。这就像你走进一个房间,做完一件事就出来了,下次再进去,你还得从门口开始。
立即学习“Python免费学习笔记(深入)”;
但生成器不一样。当一个包含
yield
next()
for
yield
yield
从内存角度看,普通函数往往需要一次性计算并返回所有结果(比如一个大列表),这可能导致内存爆炸。生成器则不然,它每次只生成一个值,用完就丢,极大地降低了内存占用,尤其适合处理无限序列或海量数据。
要理解 Python 解释器是如何管理生成器内部状态的,我们需要稍微深入到 CPython 的实现细节。这背后主要涉及两个关键的 C 结构体:
PyGenObject
PyFrameObject
当你调用一个生成器函数时,Python 解释器并不会执行函数体内的代码,而是立即创建一个
PyGenObject
PyGenObject
PyFrameObject
PyFrameObject
f_lasti
初次创建
PyGenObject
PyFrameObject
next()
PyFrameObject
执行过程中,一旦遇到
yield
PyFrameObject
f_lasti
PyFrameObject
PyGenObject
yield
next()
当再次调用
next()
PyGenObject
PyFrameObject
f_lasti
return
StopIteration
这种设计非常巧妙,它利用了现有的栈帧机制,但又通过
PyGenObject
yield from
next()
send()
throw()
close()
在
yield from
def sub_generator(): yield 1 yield 2 return "Sub done" # 返回值在老方法中很难直接获取 def main_generator_old(): for value in sub_generator(): yield value # 如何获取 sub_generator 的返回值?需要额外的try-except StopIteration逻辑
这不仅代码冗余,而且更重要的是,子生成器的返回值(通过
return
StopIteration
send()
throw()
close()
yield from
def sub_generator(): yield 1 yield 2 return "Sub done" # 这个返回值会被 yield from 捕获 def main_generator_new(): result = yield from sub_generator() # 直接委托给 sub_generator print(f"Sub generator finished with: {result}") yield 3 gen = main_generator_new() print(next(gen)) # 输出 1 print(next(gen)) # 输出 2 print(next(gen)) # 输出 "Sub generator finished with: Sub done",然后输出 3
yield from
yield
next()
send()
throw()
close()
return
yield from
yield from
这种直接委托机制,极大地简化了复杂生成器链的编写,使得代码更加清晰、易读。它不仅解决了返回值的问题,还自动处理了
StopIteration
send()
throw()
asyncio
async
await
yield from
以上就是Python源码中yield关键词是如何工作的 探索生成器的底层实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号