千家信息网

怎么理解Python的迭代器与zip

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要讲解了"怎么理解Python的迭代器与zip",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么理解Python的迭代器与zip"吧!首先抛
千家信息网最后更新 2025年01月21日怎么理解Python的迭代器与zip

这篇文章主要讲解了"怎么理解Python的迭代器与zip",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么理解Python的迭代器与zip"吧!

首先抛出一个困扰本人许久的问题:

nums = [1,2,3,4,5,6]numsIter = iter(nums)for _ in zip(*[numsIter]*3):    print(_)print(list(numsIter))

则控制台输出如何?

关于迭代器

1.对于支持迭代的集合对象,可以创建其迭代器对象。迭代器对象储存了可迭代对象的地址和遍历的位置,迭代器对象从集合的第一个元素开始访问,所有的元素被访问完迭代器被消耗(仍然占地址),但清空储存的信息(即地址和遍历位置)。使用list()函数或 * 操作符可以获取所有遍历的内容,结束后迭代器被消耗。

nums = [1,2,3,4,5,6]numsIter = iter(nums)print(nums)print(list(nums))print(nums)print(list(nums))

输出为:


[1,2,3,4,5,6]

[]

第二次键入 print(list(nums)) 时输出为空,因为迭代器对象已经找不到地址了。

2.复制迭代器对象,得到的是一个迭代器对象的引用,即地址,而不是新建一个迭代器。因此,遍历位置是共同的。

nums = [1,2,3,4,5,6]numsIter = iter(nums)numsIter_list = [numsIter] * 2print(numsIter)print(numsIter_list)for _ in numsIter_list:    print(next(_))

输出为:


[, ]
1
2

关于zip

1.在创建zip对象时,并没有直接生成新数据,而是存储了要操作对象的迭代器,当真正需要的时候,才通过迭代器遍历数据。因此,当使用list()函数或 * 操作符解压zip对象时,当然是会消耗掉储存的迭代器,使得再一次解压时返回为空。

P = [1,2,3]Q = [4,5,6]PQ_zip = zip(P,Q)print(PQ_zip)print(list(PQ_zip))print(list(PQ_zip))

输出为:


[(1, 4), (2, 5), (3, 6)]
[]

2.zip之所以能work,就是利用了迭代器储存的遍历位置,逐一地获取数据,直到其中一个迭代器被消耗掉。文首的问题就是最好的例子 。

nums = [1,2,3,4,5,6]numsIter = iter(nums)for _ in zip(*[numsIter]*3):    print(_)print(list(numsIter))

输出为:

(1, 2, 3)
(4, 5, 6)
[]

可以看见,实现的功能是把单行数据变成了3列2行。这是怎么做到的呢?执行zip时,依次访问三个同样的迭代器,每次访问,迭代器的遍历位置都会加1,于是第一轮结束后zip获取了(1,2,3),同理第二轮则获取了(4,5,6),随后迭代器被消耗。第三轮zip对象已经没有迭代器可用,于是结束执行。最后 print(list(numsIter)) 发现迭代器确实已经被消耗。

3.当使用 print 显示迭代器或zip对象的内容时,list() 和 * 操作符几乎没有区别。但上述例子中,只能用 * 操作符来实现,因为 * 操作符实际上是返回对象的地址和遍历位置,而 list() 会直接遍历完毕从而消耗掉迭代器。

nums = [1,2,3]numsIter = iter(nums)print(numsIter)for _ in zip(list(numsIter)*3):    print(_)print(list(numsIter))

输出为:


(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
[]

感谢各位的阅读,以上就是"怎么理解Python的迭代器与zip"的内容了,经过本文的学习后,相信大家对怎么理解Python的迭代器与zip这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

迭代 对象 消耗 输出 位置 地址 操作符 内容 数据 就是 问题 学习 例子 元素 函数 三个 三轮 之所以 信息 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 特殊软件开发方案 高速以太网络技术 病毒安全是否属于网络安全 黑客网络安全面试 服务器硬盘指示灯不亮 情感主播的网络技术发展 奉化敏捷软件开发管理 贵州新时代网络技术有限公司 php向数据库传数据 上海pdu服务器专用电源报价 网络安全测评的核心工作 共享服务器文件怎么设置 手机米家显示服务器错误 联想t168服务器 软件开发做项目有多忙 网络安全工作制度体系建设 学校网络安全教育归谁管 山东商业软件开发 复制数据库参数设置长度 安徽苹果软件开发哪里好 在数据库中如何修改一个表的属性 河北服务器数据恢复云空间 广州特城电脑网络技术有限公司 网络安全对青少年的影响论文 大兴服务器搬迁报价单 学软件开发的高职高专 江苏虚拟化服务器云服务器 互联网网络技术售后服务 湖北东信网络技术有限公司 公务员网络安全培训机构
0