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

时间:2018-02-19 09:20:37

标签: python list-comprehension yield python-3.7

Python 3.7文档mentionsyield表达式在用于实现理解和生成器表达式的隐式嵌套作用域中被弃用“,删除等待3.8:

  

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

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

到目前为止,我想出了这些(相当荒谬的)示例,这些示例在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]

1 个答案:

答案 0 :(得分:4)

  

理解或生成器中的收益有哪些应用?   表达

没有

这个"功能"被确认为bug并且正在为python3.7弃用,并且将在python3.8中完全删除,如果使用则会导致SyntaxError

来自docs

  

收益表达式(yieldyield from条款)现在都是   在理解和生成器表达式中弃用(除了   最左边的for子句中的可迭代表达式)。这确保了   理解总是立即返回一个容器   适当的类型(而不是潜在的返回发电机   迭代器对象),而生成器表达式不会尝试   将它们的隐式输出与任何显式的输出交错   屈服表达。

     

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