yield
keyword可以通過兩種方式使用:作爲聲明和作爲表達式。
最常見的用途是作爲生成器函數中的聲明,通常在它自己的行和所有函數中。它可以這樣使用:
yield <expr>
yield from <expr>
然而,yield表達式可以用在任何允許表達式的地方。然而,它們需要特殊的語法:
(yield <expr>)
(yield from <expr>)
正如你所看到的,括號是語法的一部分,使yield
工作作爲一種表達。因此在語法上不允許使用yield
關鍵字作爲不帶圓括號的表達式。這就是爲什麼你需要在列表理解中使用括號。
話雖這麼說,如果你想使用列表中理解語法來創建一臺發電機,你應該使用生成器表達式的語法來代替:
(x for x in xlist)
注意括號而非方括號從打開此將理解列入發生器表達式。
注意starting with Python 3.7,yield
表達式推導和發電機表達式中棄用(從最左邊的for
條款的迭代內開),以確保推導適當地評估。從Python 3.8開始,這會導致語法錯誤。
這使得確切名單在理解問題的過時用法:
>>> [(yield(x)) for x in xlist]
<stdin>:1: DeprecationWarning: 'yield' inside list comprehension
<generator object <listcomp> at 0x000002E06BC1F1B0>
其值得注意的是,圍繞'x'括號在你的例子沒有做任何事情。 'yield'是一個關鍵字,而不是一個函數。 – Blckknght
不要在理解中使用'yield'。它做了一些瘋狂的事情,這絕對不是你想要的,它應該是一個語法錯誤。 – user2357112