1 描述
zip() 函數用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的列表。python
若是各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操做符,能夠將元組解壓爲列表。函數
也即:返回一個zip對象,此對象用於生成元組,此元組的個數由最小的可迭代對象決定spa
2 語法
zip([iterable/iterator, iterable/iterator, ...])
參數指針
iterable/iterator能夠是迭代對象,也能夠是迭代器code
參數個數不限制,能夠爲一個,也能夠是多個元素,對象
3 返回值
返回由元組爲元素構成的對象——這是在python3中的現象blog
python3中的運行結果ip
>>> zip([1,2,3],[4,5,6]) <zip object at 0x7fcc3a709088>
python2中運行的結果it
>>> a = zip([1,2,3],[4,5,6]) >>> a [(1, 4), (2, 5), (3, 6)] >>> print(a) [(1, 4), (2, 5), (3, 6)]
返回值的長度取決於元素中長度最短的那個對象for循環
只有一個序列參數時,它返回一個1元組的列表。
names = ["中國移動", "中國電信", "中國聯通"] for x in zip( names): print(x)
運行
('中國移動',) ('中國電信',) ('中國聯通',)
4 實例
實例一:元素爲迭代對象,迭代對象長度不一致
numbers = [10086, 10000, 10010, 95588] names = ["中國移動", "中國電信", "中國聯通"] for x in zip(numbers, names): print(x) for x in zip(range(1,10000), numbers, names): print(x)
運行
(10086, '中國移動') (10000, '中國電信') (10010, '中國聯通') (1, 10086, '中國移動') (2, 10000, '中國電信') (3, 10010, '中國聯通')
註解:當zip()函數中的迭代對象長度不一致時,zip()返回值中元素長度與最短長度一致
實例二 含有迭代器的元素對象
numbers = [10086, 10000, 10010, 95588] names = ["中國移動", "中國電信", "中國聯通"] z1 = zip(numbers, names) for x in z1: print(x) for x in zip(range(1,10000), iter(numbers), iter(names)): print(x)
運行
(10086, '中國移動') (10000, '中國電信') (10010, '中國聯通') (1, 10086, '中國移動') (2, 10000, '中國電信') (3, 10010, '中國聯通')
實例三 含有迭代器的元素對象
numbers = iter([10086, 10000, 10010, 95588]) names = ["中國移動", "中國電信", "中國聯通"] z1 = zip(numbers, names) for x in z1: print(x) for x in zip(range(1,10000), numbers, names): print(x)
運行
(10086, '中國移動') (10000, '中國電信') (10010, '中國聯通')
實例二和實例三中都使用了迭代器,而實際運行結果卻相差較大,主要緣由是迭代器的特色決定的,迭代器只能一直向後執行,不能後退;
在實例三中第一個for循環已經使用了迭代器numbers,因此再次執行時,不是從起始位置開始的,而是從上一個「指針」位置進行的。
爲了更能說明問題,將代碼修改進行
numbers = iter([11111, 10086, 10000, 10010, 22222, 33333, 44444, 55555, 66666,77777]) names = ["中國移動", "中國電信", "中國聯通"] print(next(numbers)) for x in zip(numbers, names): print(x) print(next(numbers)) for x in zip(range(1,10000), iter(numbers), names): print(x)
運行結果
11111 (10086, '中國移動') (10000, '中國電信') (10010, '中國聯通') 33333 (1, 44444, '中國移動') (2, 55555, '中國電信') (3, 66666, '中國聯通')
這裏面有一個問題一直沒有解決,爲何zip()函數調用迭代器後,迭代器中「指針」跳過了元素22222,如今暫時沒有找到緣由。可能得在zip()源代碼中找答案了。我的以爲在zip()函數中能不用迭代器就不用迭代器
實例四
a = [1, 2, 3] b = [4, 5, 6] for (x, y) in zip(a, b): print(x,"*",y,"=", x * y)
運行
1 * 4 = 4 2 * 5 = 10 3 * 6 = 18
補充
numbers = [10086, 10000, 10010, 95588] names = ['中國移動','中國電信','中國聯通'] for x in zip(numbers,names): print(x) print("---------------------------") for x in zip(range(1,1000),numbers,names): print(x) print("---------------------------") for x,y,z in zip(range(1,1000),numbers,names): print("x:",x,'y:',y,'z:',z)
運行
(10086, '中國移動') (10000, '中國電信') (10010, '中國聯通') --------------------------- (1, 10086, '中國移動') (2, 10000, '中國電信') (3, 10010, '中國聯通') --------------------------- x: 1 y: 10086 z: 中國移動 x: 2 y: 10000 z: 中國電信 x: 3 y: 10010 z: 中國聯通
對於 for x,y,z in zip(range(1,1000),numbers,names): 變量不對應,出現過多或者過少均不行
例如
numbers = [10086, 10000, 10010, 95588] names = ['中國移動','中國電信','中國聯通'] for x,y in zip(range(1,1000),numbers,names): print("x:",x,'y:',y)
運行
Traceback (most recent call last): File "test.py", line 4, in <module> for x,y in zip(range(1,1000),numbers,names): ValueError: too many values to unpack (expected 2)
numbers = [10086, 10000, 10010, 95588] names = ['中國移動','中國電信','中國聯通'] for x,y,z,k in zip(range(1,1000),numbers,names): print("x:",x,'y:',y,'z:',z)
運行
Traceback (most recent call last): File "test.py", line 5, in <module> for x,y,z,k in zip(range(1,1000),numbers,names): ValueError: not enough values to unpack (expected 4, got 3)