Python中yield from有什么最佳的使用场景吗?

yield from iterable means for item in iterable: yield item
Python中yield from有什么最佳的使用场景吗?

9 回复

chain iterable


yield from 的核心就两点:简化嵌套生成器的代理建立双向数据通道

最典型的场景是生成器委托。比如你要写一个递归遍历树结构的生成器:

class Node:
    def __init__(self, value, children=None):
        self.value = value
        self.children = children or []

def traverse(node):
    yield node.value
    for child in node.children:
        yield from traverse(child)  # 关键在这里

# 构建一个简单的树
tree = Node(1, [
    Node(2, [Node(4), Node(5)]),
    Node(3)
])

# 前序遍历输出:1 2 4 5 3
for value in traverse(tree):
    print(value)

没有 yield from 的话,你得写个循环手动迭代子生成器,代码啰嗦还容易漏掉异常传递。

另一个实用场景是协程委托,在异步编程里很常见:

async def get_data():
    return await fetch_from_db()

async def process():
    result = await get_data()  # 这里本质也是 await from 的变体
    # 处理结果

虽然用了 await,但底层机制和 yield from 一脉相承,都是把控制流委托给子协程。

简单说,当你需要让外层生成器/协程完全代理内层时,就用 yield from

yield from 个人用的不多,但他的近亲 await 则很常用。

asyncio 模块常用

describe your question in English then search it via Google you will get best answer.

4 楼正解

转移控制权给子生成器,简单来说是打开一个双向通首,把最外层的调用方和最内层的子生器连接起来,这样二者就可以直接发送和产出值,使用 yield from 的块可以称为委派生成器

这段话好熟悉😂。。。

《流畅的 python 》,好书啊,例子也写的够详细

回到顶部