2015-04-04 62 views
5

是否有一個行表達式爲:是否有'產生髮電機的所有輸出'的簡寫?

for thing in generator: 
    yield thing 

我試圖yield generator無濟於事。

+0

答案是**否**。 – 2015-04-04 11:08:41

+1

http://stackoverflow.com/questions/17581332/converting-yield-from-statement-to-python-2-7-code是相關的 – 2015-04-04 11:11:07

+1

那些低估了這個問題的人會關心澄清嗎?這個問題非常清楚,如果它是重複的,你應該已經鏈接到原始。 – Tibor 2015-04-04 11:13:20

回答

9

在Python 3.3+中,您可以使用yield from。例如,

>>> def get_squares(): 
...  yield from (num ** 2 for num in range(10)) 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

它實際上可以用於任何迭代。例如,

>>> def get_numbers(): 
...  yield from range(10) 
... 
>>> list(get_numbers()) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> def get_squares(): 
...  yield from [num ** 2 for num in range(10)] 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

不幸的是,Python 2.7版沒有等價的結構:'(

+0

我不認爲輔助函數在Py2.7中的功能與Py3.3中的「yield from」的功能完全相同。調用這個函數只是返回另一個生成器對象,所以它和內建的iter非常相似。如果你在一個函數內調用你的'yield_from()',這個函數不會自動變成一個生成函數,就像'yield from'那樣。就我[理解](https://www.python.org/dev/peps/pep-0380/#motivation)而言,在Py2.7中,您需要編寫顯式的for-loop,如OP所示。 – 2015-04-04 11:47:38

+0

@BasSwinckels是的,幫助函數是不一樣的。但是,您可以將生成器委託給該函數,它會使代碼更簡單,不是嗎? – thefourtheye 2015-04-04 11:49:49

+0

不,我認爲輔助函數沒用,因爲它不會從調用函數中產生。正如PEP所顯示的那樣,這個'for i in generator:yield i'不能被分解爲單獨的函數。你只是重寫'iter' ... :) – 2015-04-04 11:51:48

2

您可以使用列表解析讓所有的元素出來發生器(假設發電機結束) :

[x for x in generator] 
+0

這會否定發生器的一些惰性屬性,即將其輸出轉換爲列表? – 2015-04-04 12:12:58

+0

當然。通過轉換爲列表,您可以分配所有必要的內存來存儲生成器「生成」的數據。另外,如果生成器沒有完成上述語句將永不終止。 – 2015-04-04 12:14:51

+0

單線成本很高...... – 2015-04-04 12:17:04

1

這裏是Python中簡單的一行有效2.5+的要求;-):

for thing in generator: yield thing