首页 文章

`from foo()`和`for f in foo()之间的区别:yield x`

提问于
浏览
12

在Python中,大多数收益率的例子都说明了这一点

yield from foo()

类似于

for x in foo(): yield x

另一方面,它并没有引发一些魔法 . 我觉得使用一个我不懂的魔法的函数有点不安 . 我怎么知道 yield from 的魔力,以避免陷入魔法做我不期望的事情?我应该注意到魔法提供了哪些优势?

1 回答

  • 13

    foo() 返回常规可迭代时,两者是等价的 . 'magic'在 foo() 也是发电机时起作用 . 那一刻, yield from foo()for x in foo(): yield x 案件有很大不同 .

    也可以使用generator.send() method发送数据 . 当您使用 for 循环时, yield x 表达式'receives'发送的数据; foo() 发电机永远不会看到这个 . 但是当你使用 yield from 时,发送的数据直接转到委托生成器当前暂停的任何 yield 表达式 . 换句话说, yield from 传递已发送的数据,因此委托生成器可以接收它 .

    您还可以使用generator.throw()在生成器中引发异常;在 for 循环的情况下,异常从 yield x 行引发,而 yield from 异常再次传递;异常是在 foo() 内引发的 .

    总之,这意味着 yield from 本质上在委托迭代的持续时间内替换当前生成器 .

    委托生成器也可以与父生成器通信,完成后 StopIteration 异常的 .value 属性将作为 yield from 表达式的值返回 . 您可以在委派给 foo() 生成器中使用 return <expression> 来设置该异常的值,也可以显式使用 raise StopIteration(<expression>) .

    yield fromPEP 380: Syntax for Delegating to a Subgenerator引入语言 .

相关问题