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

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

时间:2023-03-09 22:23:37浏览次数:31  
标签:__ 迭代 对象 iter next 面试 循环

一、可迭代对象

什么是可迭代对象

在数据类型的后面可以使用点加 __ 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循环会自动捕获并处理

标签:__,迭代,对象,iter,next,面试,循环
From: https://www.cnblogs.com/wei0919/p/17201708.html

相关文章

  • Java实现对象空属性(空字符串)转null
    @Slf4jpublicclassConvertUtils{/***@Description主要解决查询时前端传参为空值("")*BeanUtils.copyProperties会把空值带入目标对象中*......
  • Python迭代与生成器
    1、迭代_iter_对象方法可迭代对象,返回迭代器__next_对象方法迭代器对象,返回迭代中每一步的运算iter(object)内置函数得到object的迭代器next(object)......
  • 生成器,迭代器
    迭代器迭代器分为迭代器对象和可迭代对象,迭代就是每一次的结果都必须依赖于上一次的结果,能够通过for循环进行迭代操作,也能够通过__next__方法进行迭代操作可迭代对象内......
  • #yyds干货盘点# LeetCode程序员面试金典: 计算器
    1.题目:给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+,-,*,/四种运算符和空格 。整数除法仅保留整数部分。......
  • #yyds干货盘点# LeetCode面试题:字符串相乘
    1.简述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的BigInteger库或直接将输......
  • C# 从Object对象中读取属性的值
     先把对象转化成Type类型,再获取它的属性,再获取属性的值。staticvoidMain(string[]args){objectobj=new{Name="小红",Age="18!"......
  • js字符串详解(一):什么是字符串,内置对象以及包装类型对象
    1.什么是:多个字符组成的只读字符数组   vs数组:下标i          length          slice() concat   不同:......
  • 系统设计面试与现实完全不同
    当您面试软件开发工作时,您可能会遇到一些系统设计问题。特别是如果您正在寻求高级职位。像许多软件开发一样,面试问题与现实完全不同。面试是什么样的面试官给你一个服......
  • 内建函数对象-算数仿函数
    概念:  STL内建了一些函数对象分类:算数仿函数关系仿函数逻辑仿函数用法:这些仿函数所产生的对象,用法和一般函数完全相同使用内建函数对象,需要引入头文件#i......
  • promise对象项目应用实例
    Promise对象是一种用于处理异步操作的JavaScript对象。下面是几个Promise对象的项目应用实例:图片加载器一个图片加载器可以通过Promise对象来实现。我们可以创建......