2016-09-06 85 views
1

我知道Python中的for x in list循環,但我偶然發現了一種我找不到的文檔生成器。我發現下面的例子只適用於列表a中的列表長度爲2,或者它給出了拆包錯誤,所以我懷疑某種2元組或字典相關的解包器可能在場。有人可以向我解釋這個生成器語法的工作原理嗎?這是怎麼回事,在發生器工作在Python 2.7.x

$ python                                    
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = [[1,2],[3,4],[5,6]] 
>>> (b for c, b in a) 
<generator object <genexpr> at 0x1071abaa0> 
>>> [x for x in (b for c, b in a)] 
[2, 4, 6] 

我遇到了它在使用這種發電機在調用min項目。最初我以爲這是傳入的多個參數,但語法沒有意義,並且單獨測試它顯示了一個生成器。

https://github.com/bigbighd604/Python/blob/master/graph/Ford-Fulkerson.py#L59

+0

[https://www.python.org/dev/peps/pep-0289/](https://www.python.org/dev/peps/pep-0289/) – BPL

+2

'(二(a)中的c,b相當於'(b代表a中的(c,b))' –

+0

您將'a'解壓爲2個值'c'和'b',然後只取'b'。 –

回答

4

不要用逗號c, b上當。在Python中,逗號 - 不是括號 - 是什麼定義了一個元組。您的代碼相當於[x for x in (b for (c, b) in a)],它遍歷a的元素,將c分配給ab中的每個雙元素列表的第一個元素,然後將b分配給x。如果a有一個不是兩個元素可迭代的元素,您將得到一個ValueError

+0

啊,是的,這是逗號那把我扔掉了。在我發送的代碼鏈接中,我也被拋棄了,因爲生成器作爲參數傳遞給'min'。謝謝! –

1

從內部開始,我們正在創造從列表中選擇一個生成器表達式:

a = [[1,2],[3,4],[5,6]] 

所以,讓我們看一下一個特例:

(b for c, b in a) 

所以,如果你回頭看看列表a,我們有一個列表,其中每個子列表只是兩個項目。那麼,在你的生成器表達式中發生了什麼,是c, b將你的子列表中每個解壓後的值表示爲一個元組。但是,如果你看的表情,我們只考慮b,這就是爲什麼結果會最終被:

2, 4, 6 

然後向外移動,我們則剛剛創建從發電機表達一個列表理解:

[x for x in (b for c, b in a)] 

在列表中結束:

[2, 4, 6] 

其實,如果你正在尋找得到一個列表的是表達的,你可以做:

list(b for c, b in a)