首页 > 其他分享 >可迭代对象和迭代器对象以及for循环的本质

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

时间:2022-10-16 19:46:33浏览次数:48  
标签:__ 迭代 对象 iter next 循环 本质

目录

一、可迭代对象

之前我们对于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__不会有任何变化 还是迭代器对象本身

三、for循环的本质

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

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

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

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


标签:__,迭代,对象,iter,next,循环,本质
From: https://www.cnblogs.com/zhihuanzzh/p/16796881.html

相关文章

  • 实验2 类和对象(2)
    实验任务4#pragmaonce#include<iostream>#include<cmath>usingnamespacestd;//定义Complex类classComplex{public:Complex(doubler=0,doublei=......
  • 实验二 类和对象(2)
    4.实验任务4不使用C++标准库,自行设计并实现一个简化版复数类Complex。Complex.hpp: #pragmaonce#include<iostream>#include<string>#include<iomanip>#incl......
  • 实验2 类与对象(2)
    一、实验内容:实验任务4:1.Complex.hpp:#include<iostream>#include<cmath>usingnamespacestd;classComplex{public:Complex(doublex=0,doubley=0......
  • 实验2 类和对象
    实验4#pragmaonce#include<iostream>#include<cmath>usingnamespacestd;classComplex{public:Complex(doubler=0.0,doublei=0.0):real(r),i......
  • 如何选择数据存储空间?华为云对象存储服务,让你省心又划算​
    上至大企业,下至普通用户,在平日里都习惯将一些重要的文件存储在网络云盘上,这样才便捷日常的使用,随意翻出来查看也省时,畅享移动的数据存储魅力。来自华为云的对象存储服务OBS(O......
  • 实验2 类与对象(2)
    Task4hpp文件如下#pragmaonce#include<iostream>#include<complex>classComplex{public: Complex(); Complex(doubler,doublei=0.0); Complex(cons......
  • Java基础(七)| 类、对象、封装和构造详解
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • 实验2 类和对象(2)
    实验任务4:程序源码:complex.hpp1#pragmaonce2#include<iostream>3#include<cmath>4usingnamespacestd;5classComplex{6public:7Com......
  • Java类和对象小结
    类与对象类是一个模板:抽象的。对象是一个具体的实例:具体的方法定义、调用对应的引用引用类型:基本类型(8大基本类型)对象是通过引用来操作的属性:字段Fie......
  • 实验二——类与对象(2)
    task2:array<int,5>x3<x1>;语句在devc的环境下可能会报错,改成array<int,5>x3(x1)可正确编译。task3:to_string的功能是将数字常量转换为字符串,还有就是要注意,静态变量类外......