可迭代对象和迭代器对象以及for循环的本质


一、可迭代对象

之前我们对于for循环为什么可以遍历没有做具体解释,这里就开始对它进行解释了。

首先我们介绍什么是可迭代对象:

在数据类型的后面可以使用点加双下划线iter(.iter)来判断是不是可迭代对象

经过一圈测试得到如下的可迭代对象的范:

不是可迭代对象:
int float bool 函数对象
是可迭代对象:
str list dict tuple set 文件对象

二、迭代器对象

迭代器介绍:

迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代。

迭代器对象:

所有的可迭代对象在使用双下划线iter方法后都会编程迭代器对象,变成迭代器对象后继续使用双下划线iter方法就没有效果了,但是可以执行。判断迭代器对象的本质是查看内置方法中是否有__iter__和__next__

迭代器对象的作用

优点

1、提供了一种不依赖于索引取值的方式,正因为有迭代器的存在 我们的字典 集合才能够被for循环

2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__next__来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

缺点

1、除非取尽,否则无法获取迭代器的长度

2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

迭代器对象实操:

s1 = 'hello'  # 可迭代对象
res = s1.__iter__()  # 迭代器对象
print(res.__next__())  # 迭代取值 for循环的本质

这里需要注意,如果__next__取不到值就会报错。

注意事项

1、可迭代对象调用__iter__会成为迭代器对象

2、迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身

3、由于__iter__,__next__写起来复杂,所以使用中会出现iter()和next()这两种形式

三、for循环的本质

学完了上面的迭代器和可迭代对象相关知识,我们重新看一下for循环的结构:

for 变量名 in 可迭代对象:
循环体代码

现在我们可以知道for循环只是把字典、集合这类数据值进行了__iter__和__next__操作进行一次次取值,流程如下:

1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理


posted @   致丶幻  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
  1. 1 So Far Away (Acoustic) Adam Christopher
  2. 2 雪 Distance Capper&罗言RollFlash
  3. 3 CollapsingWorld
  4. 4 Call You Tonight Johnta Austin
雪 Distance - Capper&罗言RollFlash
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

词:Capper/罗言

曲:Capper/罗言

编曲:IOF

混音:刘城函

母带:张步若@RSS

可怜像扑火飞蛾

任凭无用的勇敢将我淹没

你充满防备的样子不像我

会不会太久

久到这结果

明明我想要却不敢对你说

我好想放手

却幻想太多

悲叹你不是世上另一个我

我愿把胸膛解剖

公开脆弱的结构

有在跳动的血肉

别再只丢我骨头

心甘情愿囚禁在深渊

舔舐着伤口和刀尖

可是雪 飘进双眼

看不见你桥牌的谎言

心甘情愿囚禁在深渊

烧一捧雪花做硝烟

为什么抿下嘴唇尝起来像铁锈

我怕这沼泽死水就要将我淹没

快要变成玩偶

可以随意玩弄

只要和你联手

我愿把胸膛解剖

公开脆弱的结构

有在跳动的血肉

别再只丢我骨头

在这么冷的天

再靠近我一点

可是雪 飘进双眼

看不见你桥牌的谎言

心甘情愿囚禁在深渊

心甘情愿囚禁在深渊

烧一捧雪花做硝烟

点击右上角即可分享
微信分享提示