【python进阶】深入理解zip()与zip(*)

文章目录


引言

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')]就不难理解了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值