【问题标题】:What are the applications of yield within a comprehension or generator expression?yield 在推导式或生成器表达式中的应用是什么?
【发布时间】:2018-07-29 11:48:12
【问题描述】:

Python 3.7 文档 mentions 指出 yield 表达式“在用于实现理解和生成器表达式的隐式嵌套范围内”已被弃用,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]

【问题讨论】:

标签: python list-comprehension yield python-3.7


【解决方案1】:

yield 在推导式或生成器中的应用是什么 表达方式?

什么都没有。

此“功能”已确认为bug,并且正在为python3.7 弃用,并将在python3.8 中完全删除,如果使用,则会导致SyntaxError

来自docs

Yield 表达式(yieldyield from 子句)现在是 在理解和生成器表达式中不推荐使用(除了 最左边的 for 子句中的可迭代表达式)。这确保了 理解总是立即返回一个容器 适当的类型(而不是可能返回一个生成器 迭代器对象),而生成器表达式不会尝试 将它们的隐式输出与任何显式的输出交错 产生表达式。

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

【讨论】:

  • 恐怕这个答案没有多大帮助。我知道此功能已被弃用,我正在尝试了解 什么 该功能实际上是什么。
  • 我仍然很想了解 Python 如何解释 OP 问题中的代码示例......我希望这种行为是一个“高级”错误,而不仅仅是代码中的错字.
猜你喜欢
  • 2017-12-16
  • 2011-07-27
  • 2015-01-14
  • 2011-08-14
  • 1970-01-01
  • 2010-10-13
  • 2012-05-28
相关资源
最近更新 更多