Python3迭代器——迭代器只能往前不会后退

本文解析了Python中迭代器的工作原理,重点讨论了zip()函数返回迭代器导致的输出异常,并揭示了为何打印操作会提前结束迭代。通过实例说明,理解迭代器的'单向性'对于正确使用zip至关重要。

迭代器

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。

  • 迭代器是一个可以记住遍历的位置的对象。

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退

  • 迭代器有两个基本的方法:iter() 和 next()。

注意,迭代器只能往前不能后退!

遇到的问题

在使用zip()函数的过程中,发现多了一行pirnt代码会导致最终输出结果不一致。
代码如下:

a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b)     # 打包为元组的列表
print("list(zipped):",list(zipped))      
t = zip(*zipped)          # 与 zip 相反,可理解为解压,返回二维矩阵式
print("t:", t)
print("____________")
for i1 in t:
    print(i1)

输出如下:

list(zipped): [(1, 4), (2, 5), (3, 6)]
t: <zip object at 0x7f45b5ec9500>
____________

但如果将代码print("list(zipped):",list(zipped))删除,for循环便可以正常输出解压后的内容。

a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b)     # 打包为元组的列表
# print("list(zipped):",list(zipped))      
t = zip(*zipped)          # 与 zip 相反,可理解为解压,返回二维矩阵式
print("t:", t)
print("____________")
for i1 in t:
    print(i1)

输出:

t: <zip object at 0x7f45b5ee0190>
____________
(1, 2, 3)
(4, 5, 6)

解惑

百思不得其解,在和同学探讨后,发现zip()函数返回的其实是一个迭代器,而迭代器有一个非常重要且容易被忽略的性质 ——“迭代器只能往前不会后退”

print那一行已经将所有元素访问完毕,所以后续for循环遍历为空。
将print那一行代码注释,便可以正常输出了。

参考

Python3 迭代器与生成器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiu_cs

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值