【问题标题】:yield(x) vs. (yield(x)): parentheses around yield in pythonyield(x) vs. (yield(x)):python 中 yield 的括号
【发布时间】:2016-06-15 20:38:42
【问题描述】:

使用 Python 3.4,我在这里得到 SyntaxError: invalid syntax

>>> xlist = [1,2,3,4,5]
>>> [yield(x) for x in xlist]
SyntaxError: invalid syntax

但这会生成一个生成器对象:

>>> [(yield(x)) for x in xlist]
<generator object <listcomp> at 0x00000076CC8E5DB0>

是否需要在 yield 周围加上圆括号?

【问题讨论】:

  • 值得注意的是,您的示例中 x 周围的括号没有做任何事情。 yield 是关键字,而不是函数。
  • 不要在理解中使用yield。它做了一些你不想要的疯狂的事情,而且它确实应该是一个语法错误。
  • 尾声:理解中的 yield 在 3.8 中变成了语法错误

标签: python python-3.x


【解决方案1】:

yield keyword 可以以两种方式使用:作为语句和作为表达式。

最常见的用途是作为生成器函数中的语句,通常在单独的一行中。可以这样使用:

yield <expr>
yield from <expr>

但是,yield 表达式可以在任何允许使用表达式的地方使用。但是,它们需要特殊的语法:

(yield <expr>)
(yield from <expr>)

如您所见,括号是使yield 用作表达式的语法的一部分。所以语法上不允许使用yield 关键字作为不带括号的表达式。这就是为什么您需要在列表推导中使用括号。

话虽如此,如果你想使用列表解析语法来创建生成器,你应该使用生成器表达式语法来代替:

(x for x in xlist)

注意括号而不是方括号,以便将其从列表推导转换为生成器表达式。


请注意,starting with Python 3.7yield 表达式在推导和生成器表达式中已被弃用(除了在最左边的 for 子句的可迭代内),以确保推导得到正确评估。从 Python 3.8 开始,这将导致语法错误。

这使得问题中的确切列表理解成为不推荐使用的用法:

>>> [(yield(x)) for x in xlist]
<stdin>:1: DeprecationWarning: 'yield' inside list comprehension
<generator object <listcomp> at 0x000002E06BC1F1B0>

【讨论】:

  • 如果您的意思是字面意义上的(x for x in xlist),那么应该使用iter(xlist)
  • 你可能想要yield from xlist
猜你喜欢
  • 2014-11-11
  • 2020-04-07
  • 2019-09-27
  • 2015-08-05
  • 2018-01-27
  • 2014-03-11
  • 2014-07-04
  • 2020-04-16
  • 2016-06-01
相关资源
最近更新 更多