欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python zip()函数的一次踩坑记

程序员文章站 2024-03-17 13:47:58
...

测试一:

l1 = [1,2,3,4]
l2 = [2,3,4,5]
l3 = zip(l1,l2)

for i in l3:
	print('for循环{}'.format(i))
	
l4=[x for x in l3]
print(l4)

测试二:

l1 = [1,2,3,4]
l2 = [2,3,4,5]
l3 = zip(l1,l2)

l4=[x for x in l3]
print(l4)

for i in l3:
	print('for循环{}'.format(i))

上述代码输出结果:

测试一结果:

Python zip()函数的一次踩坑记

测试二结果:

Python zip()函数的一次踩坑记

 

如果自己想的结果和上述结果一样,那么大佬就不用往下看啦。

 

首先 为什么 循环zip返回的对象 第一次有值,第二次就没有值了呢?

查看zip 文档

Python zip()函数的一次踩坑记

zip() 返回一个zip对象,该对象的next()方法返回一个元组,其中第i个元素来自第i个可迭代的参数。直到参数序列中最短的迭代被耗尽,然后抛出异常停止迭代,否则 next() 方法将持续返回元组。

重点就是这个 “zip对象” 是一个迭代器。 迭代器只能前进,不能后退。

比如说测试一的代码,在for循环结束的时候,迭代器的内部指针已经指向了内部的最后一个元组,然后到了下面执行列表生成式的时候,迭代器只能前进不能后退,所以指针没有被重置,可是迭代器已经没有元组可返回了,所以 打印出来的是 空list。

同理可知,测试二的代码,当执行完列表生成器以后,就不会再执行for循环了,空的东西还怎么遍历呢?

至于 为什么 zip 返回的 zip对象是迭代器,可以查看廖雪峰老师的连接: 点击跳转 迭代器 -廖雪峰

 

 

1. 可以直接作用于for循环的对象 统称为 可迭代对象:Iterable,都是Iterable类型/ 可迭代类型;

2. 可以被next()函数调用并不断返回下一个值的对象 称为 迭代器:Iterator,都是Iterator类型,它们表示一个惰性计算的序列;

3. 迭代器(Iterator )都是可迭代的对象(Iterable),但是可迭代的对象,不一定是迭代器。比如:集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

 

 

 

 

 

 

相关标签: zip