打包
zip()函数
用于将可迭代的对象
作为参数,将对象中对应的元素打包成一个个元组
,然后返回由这些元组组成的列表
。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
list1 = [1,2,3,4,5]
list2 = ["hello","good","nice","haha"]
set3 = {True,False,None,0}
zipobj = zip(list1,list2,set3) # 打包
print(zipobj) # 这是一个包,显示的是包所在的地址 <zip object at 0x00000149CFFFAB48>
print(list(zipobj)) #可以将包转化为列表,查看包中的内容
# 打印结果为 [(1, 'hello', False), (2, 'good', True), (3, 'nice', None)]
对于打印的结果,或许多多少少都会有一些疑惑,这里逐一进行解释
1、为什么列表中的元组只有3个?
首先看一下 set3
,这是一个set集合
,set集合
有两个特点:去重
、无序
。
打印一下 set3
,会发现,得到的结果是{False, True, None}
,因为在这里,0=False
,所以 set3
里,其实只有三个元素。
虽然set集合
是无序的,但是底层代码逻辑,还是以某种规则对元素内容进行了排序,False
就排到了True
前面,这一点就不再详细进行说明。
2、打包的具体过程
- 首先在
list1
中取出元素1
,在list2
中取出元素hello
,在set3
中取出元素False
,组成了第一个元组(1, 'hello', False)
; - 然后在
list1
中取出元素2
,在list2
中取出元素good
,在set3
中取出元素True
,组成了第二个元组(2, 'good', True)
; - 在
list1
中取出元素3
,在list2
中取出元素nice
,在set3
中取出元素None
,组成了第三个元组(3, 'nice', None)
; set3
里只有三个元素,所以,list1
和list2
中剩余的元素就被舍弃,最后,将三个元组放入列表中,[(1, 'hello', False), (2, 'good', True), (3, 'nice', None)]
,最终打包完成。
解包
zip()函数
可以对 zip对象
进行解包处理
语法:zip(*zipobj)
list1 = [1,2,3,4,5]
list2 = ["hello","good","nice","haha"]
set3 = {True,False,None,0}
zipobj = zip(list1,list2,set3 ) # 打包
print(zip(*zipobj)) #解包 显示的也是一串地址 <zip object at 0x000001B34E5FAB88>
# 若想查看解包的内容,可使用for循环打印(需将上一步print注释,因为上一步中已经解包)
for i in zip(*zipobj):
print(i)
# 打印结果
(1, 2, 3)
('hello', 'good', 'nice')
(False, True, None)
上面已经详细描述了打包的过程,而解包,其实就是将打包的过程逆转。最终打包的结果是[(1, 'hello', False), (2, 'good', True), (3, 'nice', None)]
- 列表中有三个元组,第一个元组
(1, 'hello', False)
,第二个元组(2, 'good', True)
,第三个元组(3, 'nice', None)
。 - 将第一个元组中的
1
取出,第二个元组中的2
取出,第三个元组中的3
取出,重新组成第一个新的元组(1, 2, 3)
; - 将第一个元组中的
hello
取出,第二个元组中的good
取出,第三个元组中的nice
取出,重新组成第二个新的元组('hello', 'good', 'nice')
; - 将第一个元组中的
False
取出,第二个元组中的True
取出,第三个元组中的None
取出,重新组成第三个新的元组(1, 2, 3)
; - 最后,通过for循环,将三个新的元组打印出来