2014-05-20 31 views
1

你好,謝謝你看我的問題!我最近被引入到了生成器中,並且我閱讀了關於'Python yield關鍵字解釋'的內容。根據我的理解,yield是即時生成的,不能被索引,並且會記住yield命令執行後的剩餘位置(如果我錯了,請糾正我的錯誤,我還是這個新手)。Python:追加一個產生一個列表的函數?

我的問題是爲什麼呢:

from itertools import combinations 

x = [['4A'],['5A','5B','5C'],['7A','7B']] 

y = list() 

for combination in x: 
    for i in range(1,len(combination)+1): 
     y.append(list(combinations(combination,i))) 
print y # [[('4A',)], [('5A',), ('5B',), ('5C',)], 
     # [('5A', '5B'), ('5A', '5C'), ('5B', '5C')], 
     # [('5A', '5B', '5C')], [('7A',), ('7B',)], [('7A', '7B')]] 

但是,這並不工作:

from itertools import combinations 

x = [['4A'],['5A','5B','5C'],['7A','7B']] 

y = list() 

for combination in x: 
    for i in range(1,len(combination)+1): 
     y.append((combinations(combination,i))) 
print y 

它產生後直接因爲我追加的組合爲Y那爲什麼當它是以它的工作列表形式附加的,但是當我通常這樣做時,它不會呢?

+0

生成器本身就是一個對象。在第一種情況下,你追加了將'list'構造函數傳遞給'y'列表的結果。然而,在第二種情況下,您將生成器對象本身附加到該列表,而不是從一個列表創建的「列表」。 – martineau

回答

3

當您撥打list(generator_function())時,generator_function被迭代耗盡,並且每個元素都存儲在一個列表中。所以,這三個動作做同樣的事情:

l = list(generator_function()) 
... 
l = [x for x in generator_function()] 
... 
l = [] 
for x in generator_function(): 
    l.append(x) 

在你的榜樣,而不包括list(..),你只是追加combinations發電機對象到y。使用list(...),您正在遍歷combinations生成器以生成list對象,然後將其附加到y

相關問題