引言
zip
函数的官方文档说明:
zip(iter1 [,iter2 […]]) --> zip object
Return a zip object whose .next() method returns a tuple where
the i-th element comes from the i-th iterable argument. The .next()
method continues until the shortest iterable in the argument sequence
is exhausted and then it raises StopIteration.
翻译过来为:
zip
函数接收一个或者数个可迭代对象
作为参数,并返回一个zip
对象。
zip
对象有一个next()
方法,返回一个元组,该元组的第i
个元素来源于第i
个迭代器。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
通俗点说,就是:
该zip
对象的第一个元素的值为,输入的所有可迭代对象
的第一个元素所组成的元组
zip()
input1 = ['a', 'b', 'c']
input2 = ['A', 'B', 'C']
out_zip = zip(input1, input2)
print(out_zip)
输出:
<zip object at 0x7fd6d3d2bd08>
out_zip
是一个zip
对象,将其转化为list
,则可以看到它的值
out_zip_list = list(out_zip)
print(out_zip_list)
输出:
[('a', 'A'), ('b', 'B'), ('c', 'C')]
可以看到,out_zip
的第一个元素的值为input1
的第一个元素和input2
的第一个元素所组成的元组
zip(*)
大部分博客中提到
与 zip 相反,zip(*) 可理解为解压
事实上,这是非常不严谨的。zip(*)
本质上是再一次调用了zip()
,其中的*
仅用作解包。
input1 = ['a', 'b', 'c']
input2 = ['A', 'B', 'C']
out_zip = zip(input1, input2)
out_unzip = zip(*out_zip)
list(out_unzip)
输出:
[('a', 'b', 'c'), ('A', 'B', 'C')]
那么zip(*)
可实现所谓的解压功能,其背后的原理是什么呢?
在上一节zip()
的代码中可以看到,out_zip
转换为list
后,其包含的数据内容为[('a', 'A'), ('b', 'B'), ('c', 'C')]
在调用了zip(*out_zip)
命令时,*
指令将可迭代对象out_zip
,也即[('a', 'A'), ('b', 'B'), ('c', 'C')]
解包为[('a', 'A')
, ('b', 'B')
和('c', 'C')]
三个对象。
因此,out_unzip = zip(*out_zip)
指令实际上执行的是
out_unzip = zip(('a', 'A'), ('b', 'B'), ('c', 'C'))
根据上一节zip()
的说明,输出结果为[('a', 'b', 'c'), ('A', 'B', 'C')]
就不难理解了。