yield 在理解式或生成器表达式中的应用是什么?

Nor*_*ius 2 python yield list-comprehension python-3.7

的Python 3.7的文档提到的是yield表达式弃用“在用于实现内涵和发电机表达的含蓄嵌套范围”,以去除3.8挂起:

由于它们对包含范围的副作用,yield 表达式不允许作为用于实现推导式和生成器表达式的隐式定义范围的一部分(在 Python 3.7 中,此类表达式在编译时会发出 DeprecationWarning,在 Python 3.8+ 中它们会发出 SyntaxError) .

我试图了解此更改会影响(中断?)什么,因为乍一看它解决了一个相当深奥的场景。首先yield在列表理解或生成器表达式中使用 a 是否有充分的理由?

到目前为止,我想出了这些(相当荒谬的)示例,它们在 Python 3.8 中应该是非法的:

>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
>>> list([(yield i) for i in range(5)])
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

yield 在理解式或生成器表达式中的应用是什么?

没有。

这个“特性”被确认是一个bug,正在被python3.7弃用,将在python3.8中完全删除,导致SyntaxErrorif使用。

文档中

Yield 表达式(包括yieldyield from子句)现在在推导式和生成器表达式中被弃用(除了最左边的 for 子句中的可迭代表达式)。这确保推导式总是立即返回适当类型的容器(而不是潜在地返回生成器迭代器对象),而生成器表达式不会尝试将其隐式输出与任何显式 yield 表达式的输出交错。

在 Python 3.7 中,这样的表达式DeprecationWarning在编译时会发出,在 Python 3.8+ 中它们会发出SyntaxError. (由 Serhiy Storchaka 在 bpo-10544 中提供。)