2016-06-15 57 views
3

使用Python 3.4,我得到SyntaxError: invalid syntax这里:收益率(X)与(收益率(X)):围绕产量括号在Python

>>> 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> 

需要围绕产量的圆括号吗?

+1

其值得注意的是,围绕'x'括号在你的例子没有做任何事情。 'yield'是一个关键字,而不是一个函数。 – Blckknght

+1

不要在理解中使用'yield'。它做了一些疯狂的事情,这绝对不是你想要的,它应该是一个语法错误。 – user2357112

回答

6

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> 
+0

如果你的意思是'(x for x in xlist)''然后应该使用iter(xlist)'来代替。 – jfs