我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

python语言里面,有很多奇怪的数据类型,其中一个就是zip数据类型。据苏南大叔的理解,它和平时所说的zip压缩格式,还是不一样的。苏南大叔的理解是:zip类型就是个类似dict类型的数据类型。具有的公用就两个:整理数据+封包数据。区别于dict类型的功能就是封包,封起来别人看不到。由于解开数据并没有门槛,用于数据加密解密,似乎也是没有啥效果的。

苏南大叔:python语言,如何理解zip函数?如何打印zip类型数据? - python-zip-data
python语言,如何理解zip函数?如何打印zip类型数据?(图4-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。本文描述python语言里面,如何使用zip()*zip(),对数据进行封装和解包。测试环境:win10python@3.6.8。本文对于zip类型的解读,都是苏南大叔自己的想法,如有不妥,还请指正。

普通数据封包

正如苏南大叔所说的,和这个zip最类似的是dict。数据都是成组出现的,通过zip给缝合到一起。

def get_zip(debug=False):
    a = ["苏南", "大叔", "博客"] # list
    b = ("唐山", "北京", "燕郊") # tuple
    z = zip(a, b)
    if (debug):
        print(type(a),type(b),type(z))
        print(list(z))
    return z
z = get_zip(True)

输出:

<class 'list'> <class 'tuple'> <class 'zip'>
[('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊')]

上面这个例子中,zip数据类型把list数据类型和tuple数据类型缝合到了一起。zip类型本质上还是个迭代器,所以它具有特征:

  • 无法直接输出,但是可以转类型输出。
  • 一用即废,无法第二次使用。所以,可以考虑保存到别的类型变量。
z = get_zip()
print(z)
for i in z:
    print(i,type(i))  # 'tuple'

输出:

<zip object at 0x000002184002E4C8>
('苏南', '唐山') <class 'tuple'>
('大叔', '北京') <class 'tuple'>
('博客', '燕郊') <class 'tuple'>

输出方式之*zip

官方推荐的方式是使用*zip来对zip进行解包,这个函数是不是非常奇怪?星号其实并不是函数名的一部分,实际上是个用于迭代器的解包运算符。这个问题,待后续讨论。

a = ["苏南", "大叔", "博客"] # list
b = ("唐山", "北京", "燕郊") # tuple
c = ("来自", "住在", "曾经") # tuple
print(*zip(a,b,c))
# ('苏南', '唐山', '来自') ('大叔', '北京', '住在') ('博客', '燕郊', '曾经')
这个*zip很不好用,条件苛刻。

输出方式之迭代输出

可以迭代输出:

z = get_zip()
for i in z:
    print(i,type(i))

输出:

('苏南', '唐山') <class 'tuple'>
('大叔', '北京') <class 'tuple'>
('博客', '燕郊') <class 'tuple'>

转换类型输出【推荐】

zip类型可以转化为传统的已知类型,比如list/tuple/dict

z = get_zip()
print(list(z))
# [('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊')]
z = get_zip()
print(tuple(z))
# (('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊'))
z = get_zip()
print(dict(z))
# {'苏南': '唐山', '大叔': '北京', '博客': '燕郊'}
z = get_zip()
print(set(z))
# {('博客', '燕郊'), ('苏南', '唐山'), ('大叔', '北京')}

苏南大叔:python语言,如何理解zip函数?如何打印zip类型数据? - 数据类型转化
python语言,如何理解zip函数?如何打印zip类型数据?(图4-2)

打包的数据【注意set类型】

zip不但可以打包两组数据,也可以打包很多个数据,一一对应即可。如果某条数据的成员多,那么会自动舍弃。虽然支持打包set数据,但是由于set数据的天生去重并且无序性,打包的结果会并不具有唯一性。所以,最好不要试图处理set数据(也就是大括号包裹的数据)。

a = ["苏南", "大叔", "博客"] # list
b = ("唐山", "北京", "燕郊") # tuple
c = {"ts", "bj", "yj"} # set
print(*zip(a,b,c))

多次输出可以发现,涉及到set为输入类型的时候,会有随机输出的情况。

('苏南', '唐山', 'yj') ('大叔', '北京', 'ts') ('博客', '燕郊', 'bj')
('苏南', '唐山', 'bj') ('大叔', '北京', 'ts') ('博客', '燕郊', 'yj')

对于输出强制转化为set的情况,输出的内容也是无序的。但是,并不影响效果。

苏南大叔:python语言,如何理解zip函数?如何打印zip类型数据? - set的无序性特别注意
python语言,如何理解zip函数?如何打印zip类型数据?(图4-3)

循环取值tuple

import numpy as np
x = np.arange(0, 3)
y = x * x
print(x, type(x))
print(y, type(y))
for xy in zip(x, y):
    print(xy, type(xy))

苏南大叔:python语言,如何理解zip函数?如何打印zip类型数据? - zip-tuple
python语言,如何理解zip函数?如何打印zip类型数据?(图4-4)

相关链接

总结

python这些数据类型,总是让人眼花缭乱,让人措不及防。更多python经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python