yield from用于委托生成器执行,可简化代码并实现数据透传、异常传递和双向通信。

在Python协程中,yield from 主要用于委托生成器或协程的执行,把当前生成器的操作“转发”给另一个可迭代对象或子生成器。它不仅简化了代码,还能让外层生成器直接与内层生成器通信,实现数据的透传和异常传递。
基本用法:连接两个生成器
当你有一个生成器函数,想从中调用另一个生成器,并依次产出它的值,可以直接使用 yield from。
def sub_generator(): yield 1 yield 2 yield 3def main_generator():yield from sub_generator()yield "done"
使用
for value in main_generator():print(value)
输出:
1
2
3
done
这里 yield from 把 sub_generator() 的所有产出值直接交给 main_generator 的调用者,无需手动遍历。
在协程中传递结果
yield from 还能将子生成器的返回值传递给父生成器。当子生成器通过 return 返回值时,这个值会成为 yield from 表达式的返回值。
立即学习“Python免费学习笔记(深入)”;
def sub_task(): yield "step1" yield "step2" return "result_from_sub"def main_task():result = yield from sub_task()yield f"received: {result}"
for value in main_task():print(value)
输出:
step1
step2
received: result_from_sub
注意:子生成器结束时的 return value 被捕获并赋给了 result,这是普通 for + yield 做不到的。
协程中的双向通信
yield from 支持调用者向子生成器发送数据或抛出异常,实现完整的协程协作。
def echo_subgenerator(): while True: try: data = yield if data == "quit": return "bye" print(f"echo: {data}") except ValueError: print("caught ValueError")def delegator():result = yield from echo_subgenerator()print(f"sub finished with: {result}")
gen = delegator()next(gen) # 启动gen.send("hello") # 输出: echo: hellogen.send("world") # 输出: echo: worldgen.throw(ValueError) # 输出: caught ValueErrorgen.send("quit") # 输出: sub finished with: bye
所有 send、throw 操作都会被 yield from 自动转发到 echo_subgenerator,调用者就像直接操作子协程。
基本上就这些。yield from 在 Python 3.4 及更早版本中是构建协程的核心工具,后来被 async/await 取代,但在理解生成器委托机制时仍很重要。
以上就是python协程里yield from如何使用?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1382946.html
微信扫一扫
支付宝扫一扫