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

2024-03-28

在Python中,大多数yield from的例子都是这样解释的

yield from foo()

类似于

for x in foo(): yield x

另一方面,它似乎并不完全相同,并且有一些魔法。我对使用一个执行我不理解的魔法的函数感到有点不安。关于它的魔力我必须知道什么yield from以避免陷入魔法做出我意想不到的事情的情况?我应该注意魔法提供了哪些优势?


When foo()返回一个正则迭代,两者是等价的。当“魔法”发挥作用时foo() is a 发电机也。就在那一刻,yield from foo() and for x in foo(): yield x情况存在重大差异。

发电机可以是sent数据也是如此,使用generator.send() method https://docs.python.org/3/reference/expressions.html#generator.send。当您使用for循环,yield x表达式“接收”发送的数据;这foo()生成器永远不会看到这个。但是当你使用yield from发送的数据直接发送到任何地方yield委托生成器当前暂停的表达式。换句话说,yield from传递发送的数据,以便委托生成器可以接收它。

您还可以提出例外情况in一个发电机,具有generator.throw() https://docs.python.org/3/reference/expressions.html#generator.throw;与for循环情况下,异常是从yield x线,同时与yield from异常再次传递;异常是在内部引发的foo()反而。

综合起来,这意味着yield from 在本质上在委托迭代期间替换当前生成器。

完成后,委托生成器还可以与父生成器进行通信.value的属性StopIteration引发的异常作为值返回yield from表达。您可以使用以下方法设置该异常的值return <expression>在委托给foo()发电机,或者你可以使用raise StopIteration(<expression>)明确地。

yield from被引入到该语言中PEP 380:委托给子生成器的语法 http://www.python.org/dev/peps/pep-0380/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`yield from foo()` 和 `for x in foo(): Yield x` 之间的区别 的相关文章

随机推荐