2013-03-29 44 views
1

一個Python 3學習者在這裏解釋蟒蛇拉鍊和拆包的解決方案:

question有以下接受的答案:

rr,tt = zip(*[(i*10, i*12) for i in xrange(4)]) 

返回兩個元。如果有人能夠分解答案並解釋Python 3在做什麼(我知道range()在Python 3中返回一個迭代器),我將不勝感激。我理解列表解析,但我對解包感到困惑(我以爲你只能使用星號表達式作爲賦值目標的一部分)。

我同樣被下面的代碼弄糊塗了。我理解結果和壓縮(或者認爲我是這樣),但是星號表達式再次讓我感動。

x2, y2 = zip(*zip(x, y)) 

this

>>> x = [1, 2, 3] 
>>> y = [4, 5, 6] 
>>> zipped = zip(x, y) 
>>> list(zipped) 
[(1, 4), (2, 5), (3, 6)] 
>>> x2, y2 = zip(*zip(x, y)) 
>>> x == list(x2) and y == list(y2) 
True 

回答

4

*expression適用argument unpacking的函數調用。它需要expression部分,其中解析爲一個序列,並使該序列中的每個元素成爲該函數的單獨參數。

所以,zip(x, y)返回的序列,並且在該序列中的每個元件由一個參數傳遞給zip()功能。

對於zip(*[(i*10, i*12) for i in xrange(4)])它可能是更清晰一點;這裏有幾個因素:

  • [(i*10, i*12) for i in xrange(4)](應該是在Python 3 range()創建具有4元組的列表,[(0, 0), (10, 12), (20, 24), (30, 36)]
  • zip(*...)部分然後取各那些4元組,並將這些作爲參數功能zip()
  • zip()取每個元組並對其元素進行配對;每個元組有兩個元素意味着結果是每個4個值的2個列表。

因爲zip()函數返回兩個序列,所以它們可以分配給兩個變量。

我會發現下面一個更可讀的版本相同的表達:

rr, tt = tuple(range(0, 40, 10)), tuple(range(0, 48, 12)) 
+0

非常感謝你。你的回答非常明確。 – Disnami