2014-01-20 17 views
1

我是新來的Python和編程。有人可以詳細解釋以下代碼嗎?Python:多個參數如何工作?

def myzip(*seqs): 
    seqs = [list(S) for S in seqs] 
    res = [] 
    while all(seqs): 
     res.append(tuple(S.pop(0) for S in seqs)) 
    return res 

>>> myzip([1, 2, 3], ['a', 'b', 'c']) 
[(1, 'a'), (2, 'b'), (3, 'c')] 

特別是,我不理解S是用於在列表元素(例如12 ...)或列表([1, 2, 3])。

我想我需要每一行的詳細解釋。

+0

爲什麼即使'append'和'tuple'在'for'循環之外,似乎'for'循環更多地在外部?如下所示: for S in seqs: res.append(tuple(S.pop(0))) 我認爲是因爲更多的for循環在裏面,結果應該是: (1,2,3,'a ','b','c') 爲什麼我錯了?爲什麼for循環的位置並不重要? – user2988464

回答

0

seqs是兩個單獨的列表的列表:[1,2,3]和[ 'A', 'B', 'C']

現在while all(seqs):將通過seqs的元素迭代 - 兩個上面提到的列表。 然後,我們創建一個空列表res,並將其追加到tuple對象中。 每個元組對象將逐漸包含seqs中每個列表的第一個元素。 pop(0)將返回第一個元素並將其從列表中移除,從而更改列表(列表是可變的)。

因此,你正在做的是你正在創建一個通過配對列表中的相應元素獲得的元組列表。

當你說seqs = [list(S) for S in seqs],S引用seqs中的每個列表元素。但是,在對函數的這種特殊調用中,由於您將列表作爲元素傳遞,因此此語句變得多餘。

2

在列表理解中,S被分配給傳遞給函數的每個參數; seqs是傳入的參數列表,並且您傳遞了兩個列表。所以S首先綁定到[1, 2, 3]然後['a', 'b', 'c']

>>> seqs = [[1, 2, 3], ['a', 'b', 'c']] 
>>> seqs[0] 
[1, 2, 3] 

第一行只是確保在所有的參數都變成了清單,明確,這樣你以後可以在每次調用list.pop(0)。這使您可以在字符串中,元組,字典,或任何其他可迭代作爲參數傳遞給這個函數:然後

>>> myzip('123', 'abc') 
[('1', 'a'), ('2', 'b'), ('3', 'c')] 

while all(seqs):循環迭代,直到至少有一個參數是空的。換句話說,循環終止時最短序列已經被耗盡:

>>> myzip('1', 'abc') 
[('1', 'a')] 

在該循環中,每個輸入參數的第一個元素是從列表中刪除,並加入到res爲元組。對於2個輸入列表,這意味着首先(1, 'a')被添加到res,然後(2, 'b')然後(3, 'c')

0

首先您需要知道什麼是zip函數。因爲這個函數和python中的zip完全一樣。

def myzip(*seqs): 

第一行說這個功能可以讓你想盡可能多的說法,他們都將在一個列表中收集儘可能seqs。像myzip([1, 2, 3], ['a', 'b', 'c'])這樣的用法給你seqs = [[1, 2, 3], ['a', 'b', 'c']]

seqs = [list(S) for S in seqs] 

然後您要確保seqs中的每個項目都是列表項。該行將每個項目轉換爲列表。這是list所做的。 (即使'123'['1', '2', '3']到)

res = [] 
    while all(seqs): 
     res.append(tuple(S.pop(0) for S in seqs)) 
    return res 

在這四行它彈出的seqs每個S的第一元件,併爲最終結果的元組。最終結果是一個清單(res = [])。 在循環條件:all(seqs)它檢查是否所有的seqs元素都可用。如果一個人變空了,它會打破循環。 在迴路中,pop(0)S中刪除第一個元素,並將其作爲值S.pop(0)返回。這樣它更新了seqs的所有元素。爲下一個循環。

tuple在所有第一個元素中創建像(1, 'a')這樣的元組。下一次迭代將會是`(2,'b'),因爲之前所有的第一個元素都彈出了。

列表中的所有這些元組是res是它的目標。 res.append將這些元組添加到最終結果中。