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

标签 python python-3.x generator yield yield-from

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

yield from foo()

类似于

for x in foo(): yield x

另一方面,它似乎并不完全相同,并且有一些魔法。我对使用一个我不理解的魔法函数感到有点不安。关于 yield from 的魔力,我需要知道什么才能避免发生我意想不到的事情?魔术提供了哪些优势,我应该知道?

最佳答案

foo()返回一个常规的可迭代对象,两者是等价的。当 foo() 时,“魔法”开始发挥作用。也是一个生成器。在那一刻,yield from foo()for x in foo(): yield x情况大不相同。

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

您还可以在生成器中引发异常,使用 generator.throw() ;与 for循环情况,从 yield x 引发异常行,同时使用 yield from再次传递异常; foo() 内部引发异常相反。

一起,这意味着 yield from 本质上在委托(delegate)迭代期间替换当前生成器。

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

yield from使用 PEP 380: Syntax for Delegating to a Subgenerator 引入语言.

关于python - `yield from foo()` 和 `for x in foo(): yield x` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890604/

相关文章:

python - Python 中复杂列表理解语句的操作顺序和内部创建资源的数量

python-3.x - 为什么numba cuda调用几次后运行速度变慢?

python - 这是生成器表达式吗?

python - 算法以其产品的顺序获取列表的每个可能子集,而不构建和排序整个列表(即生成器)

Python matplotlib 值错误 : The truth value of an array with more than one element is ambiguous

python - 在 Pandas 中获得滚动平均值的最快方法?

python - 如何以最有效的方式翻转数据集?

Python:如何制作递归生成器函数

python - 从 Tkinter 调用可执行文件时出错

python - 循环使用两个计数器