2013-12-18 48 views
3

我想弄清楚Python中的生成器,我試圖過濾列表並將它們平方並返回輸出。Python發生器中的意外輸出

list = [1, 4, -5, 10, -7, 2, 3, -1] 

def square_generator(optional_parameter): 
    return (x ** 2 for x in list if x > optional_parameter) 
g = (square_generator(i) for i in list) 

h = square_generator(0) 
print h 

我做錯了什麼?

+6

不要使用'list'作爲變量名;它掩蓋了內置的類型。 –

+0

這裏的問題究竟是什麼?你期望看到什麼產出?你忘了迭代表達式嗎? –

+0

預期產量和實際產量是多少? – rightfold

回答

5

當你定義一個發電機必須遍歷它像這樣:

for x in h: 
    print x 

如果你只是嘗試打印生成,那麼你會得到對象:如果你想

<generator object <genexpr> at 0x02A4FB48> 
+0

傻了,謝謝。 – ajkumar25

3

產生一個列表,就用一個列表理解:

def square_generator(optional_parameter): 
    return [x ** 2 for x in somelist if x > optional_parameter] 

或關閉呼叫list()在發電機(前提是你沒有使用list作爲本地名):

list(h) 

你發生器工作得很好,否則:

>>> somelist = [1, 4, -5, 10, -7, 2, 3, -1] 
>>> def square_generator(optional_parameter): 
...  return (x ** 2 for x in somelist if x > optional_parameter) 
... 
>>> list(square_generator(0)) 
[1, 16, 100, 4, 9] 
1

square_generator函數返回一個發電機對象。生成器是迭代器,它們不是列表,而是包含用於生成序列的下一個元素的規則的對象。

所以,當你的函數返回時,它不會計算平方。它們只在需要時才計算。因此,您需要遍歷序列以獲取元素。在您請求查看它們之前,它們根本不存在。

這也意味着當你迭代列表時它會消失。如果你希望它是持久的,你必須看看馬丁彼得斯的答案,即使用列表而不是生成器/迭代器。