飞道的博客

python3 zip() 函数使用指南

574人阅读  评论(0)

zip()函数用于对多个可遍历容器对应元素的打包,zip(*)的作用刚好与之相反。在python2、python3中zip()函数有所不同。

python2中的zip() & zip(*)

zip(iterator1,iterator2)

zip(*iterator)

python2中zip()非常简单,其作用就是将iterator1和iterator2中相同位置的元素打包成一个元组,最后返回一个包含这些元组的列表。长度以短的iterator为基准。zip(*)就是把参数iterator(一般都是zip()打包生成的iterator)拆包,返回一个列表,列表中每个元素是拆包出来原始容器。

python3中的zip() & zip(*)

zip()

python3中zip()函数做了比较大的改动,zip()返回的将不再是一个列表,而是一个封装的 zip对象 ,目的是为了节省空间。

这个对象没办法直接打印输出或者使用,只能先手动将其转化为list

但是zip对象本身依旧是可以被遍历

乍一看貌似和普通list没什么区别,既然可以直接遍历那为什么还要把他先转为list?
因为zip对象还有一个特点就是即用即扔

可以看到在遍历这个对象之后,再把它转为list,将会是一个空的list.
即用即扔的意思是,zip对象中的内容一旦被访问,立即释放。访问什么,就释放什么。以此达到减少内存占用的目的。

zip(*)

zip(*)是zip()配套的逆向操作,和python2相比,它接收的参数不仅可以是普通的iterator ,也可以是zip对象。不管输入是什么,它返回的都会是一个zip对象。

传入zip:

传入list:(当list中,每个元素长度不一致时,默认以最短那个为基准)

最后还有一点,zip对象还可以通过赋值直接被拆封成多个tuple:


补充:

另外,zip()和zip(* )在某在条件下的功能是可以相互替代的,并没有严格意义上的互逆。例如:

也就是说,zip()和zip(*)的唯一差别其实就是输入对象的个数不同。把两个迭代对象输入到zip()中,和把两个迭代对象组成一个列表输入到zip( *)中,达到的效果完全一致。

总结

python3中的zip对象有如下性质:

  1. 可遍历迭代
  2. 即用即扔
  3. 赋值解封为tuple

参考:

菜鸟教程–Python2 zip() 函数
菜鸟教程–Python3 zip() 函数


转载:https://blog.csdn.net/weixin_43301333/article/details/105747774
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场