引言
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')]就不难理解了。
深入理解Python的zip()函数
本文详细解析Python中zip()函数的工作原理,包括如何使用zip()组合多个可迭代对象,以及如何通过zip(*)实现所谓的“解压”功能。通过实例演示,帮助读者更好地掌握zip()函数的使用技巧。
3659





