2016-06-15 84 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