本節書摘來自異步社群《python資料科學指南》一書中的第1章,第1.19節,作者[印度] gopi subramanian ,方延風 劉丹 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
zip函數将兩個相同長度的集合合并成對,它是python的内置函數。
我們通過一個簡單示例來示範zip函數。
我們傳遞兩個序列給zip函數,并列印輸出。
<code>print zip(range(1,5),range(1,5))</code>
本例中zip函數的兩個參數是兩個清單,這兩個清單都是由從1到5的數值組成。range函數有3個參數:起始數值、結束數值和步長,預設步長為1。本例中,我們分别把1和5作為清單的起始和結束值。記住,python是右側關閉的,是以range(1,5)将傳回如下。
<code>[1,2,3,4]</code>
我們傳遞了兩個序列給zip函數,輸出結果如下。
<code>[(1, 1), (2, 2), (3, 3), (4, 4)]</code>
記住兩個集合的大小必須一緻,如果不滿足,則輸出結果會削減以比對較小的集合大小。
現在請看下面的代碼。
你能猜到輸出結果是什麼樣的嗎?
我們來看看*操作符是做什麼的,它用來将集合中的每個元素作為位置參數進行傳遞。
power函數需要兩個參數,a是一個元組,你會發現,*操作符将元組分為了兩個獨立的參數。它把元組分成了2和3,兩者被作為參數傳遞,即pow(2,3),得到的結果是8。
<code>**</code>操作符可以用來将字典中的元素進行分解,我們看如下的代碼段。
<code>a_dict = {"x":10,"y":10,"z":10,"x1":10,"y1":10,"z1":10}</code>
<code>**</code>操作符将字典中的元素變成命名參數進行傳遞。本例中,我們使用<code>**</code>操作符對字典進行操作,會得到6個參數。請看如下的函數,它需要6個參數。
print語句的輸出結果是0。
使用這兩種操作符,我們可以編寫一些函數,可以接收的變量參數個數不再受限。
如你所見,上面代碼中的any_sum函數可以使用任意數量的變量。嚴謹的讀者可能會疑惑,為什麼不使用清單作為any_sum函數的參數呢?确實本例可以使用清單來傳遞參數,但我們很快就會遇到一些情形,這些情形下,我們甚至不知道要傳遞什麼類型的參數。
回到zip函數的應用上來,zip函數的一個缺點是它會立刻計算完一個清單,當我們使用兩個超大的清單時,可能會出現一些問題。izip函數是用來解決此類狀況的,它隻在需要的時候計算相應的元素。izip是itertools子產品的一個組成部分,請參閱1.24節“使用itertools”中的相關内容。
第1章“python在資料科學中的應用”中1.24節“使用itertools”的相關内容。