yield(x)vs.(yield(x)):python中围绕yield的括号

时间:2016-06-15 20:38:42

标签: python python-3.x

使用Python 3.4,我在这里得到ICollection<personPartner>

SyntaxError: invalid syntax

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

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

是否需要围绕产量的圆括号?

1 个答案:

答案 0 :(得分:8)

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表达式在comprehensions和generator表达式中不推荐使用(除了最左边的for子句的可迭代内),以确保正确评估结构。从Python 3.8开始,这将导致语法错误。

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

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