Python基础之迭代器

news/2024/4/24 19:59:35/

一、什么是迭代器

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

例如:

while True:msg = input("请输入内容>>>")print(msg)

这只是一个单纯的循环,不是迭代。

如下才是迭代:

name = ['lili','小明', '小红']
index = 0
while index < len(name):print(name[index])index += 1

输出结果:

lili
小明
小红

这个例子,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值。

1.1:可迭代对象

通过索引的方式进行取值,只适用于序列类型:字符串、元组、列表。对于没有索引的字典、集合等非序列类型,进行迭代取值,就使用到了迭代器。

什么是可迭代对象呢?

内置有__iter__()方法的对象,就是一个可迭代对象,字符串、元组、列表、字典、集合、打开的文件都是一个可迭代对象。

dic = {'a':1, 'b':2}
dic.__iter__()

可以使用isinstance()方法来判断对象是不是可迭代对象。使用方法如下,返回值为bool值。

isinstance('对象名称', Iterable)

1.2:迭代器对象

内置有__iter__()和__next__()方法的对象,就是一个迭代器对象。

打开的文件本身就是一个迭代器对象,执行迭代器对象.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器中的下一个值。

迭代器是Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值。

dic = {'a':1, 'b':2}      # 可迭代对象dic
s = iter(dic)             # 本质就是在调用dic.__iter__(),返回dic的迭代器对象s
print(next(s))       # 输出:a
print(next(s))       # 输出:b
print(next(s))       # 抛出StopIteration的异常,代表无值可取,迭代结束

迭代器对象不一定是可迭代对象,但可迭代对象一定是迭代器对象

二、for循环原理

例如一个遍历字符串取值的过程:

for el in "abc":print(el)
# a
# b
# c

for循坏在执行的时候,首先会在“abc”字符串对象上调用iter()方法,返回一个定义了__next__()方法的迭代器对象,然后再调用该迭代器对象的next()方法将取到的值赋给el,next()方法会逐一访问“abc”中的元素,当元素用尽的时候,next()方法会引发一个StopIteration异常来通知for循环,捕捉到异常后,终止循坏。

itor = iter("abc")   # 调用iter()方法,生成迭代器对象
print(itor)        # <str_iterator object at 0x100a6fcd0>
print(dir(itor))   # dir()可以显示传入对象的所有属性和方法,有__iter__和__next__
print(next(itor))  # 用python内置的next()函数来调用迭代器内部的__next__()方法

三、迭代器的优缺点

3.1:优点

1、为序列和非序列类型提供了一种统一的迭代取值方式。

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

3.2:缺点

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

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


http://www.ppmy.cn/news/47860.html

相关文章

【C语言】位运算 {位运算的应用 :关闭位,判断位,打开位,转置位;位域}

一、基础 参与位运算的对象只能是整型数据(int, unsigned, char)&#xff0c;不能为实型 移位操作符 按位左移n位表示&#xff1a;原数*2^n按位右移n位表示&#xff1a;原数/2^n&#xff08;整除&#xff09;上述运算只适用于左右移位时被溢出舍弃的位不包含1的情况 二、位运…

文本批量翻译-批量翻译文件名

批量将英文翻译成中文的软件 批量将英文翻译成中文的软件的主要用途场景主要是在需要大量翻译英文文本到中文的场景下使用&#xff0c;例如&#xff1a; 商务文件翻译&#xff1a;许多企业需要将其商务文件&#xff0c;如合同、报告、信函等翻译成中文&#xff0c;以便其中文读…

springboot+vue职称评审管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的职称评审管理系统。项目源码请联系风歌&#xff0c;文末附上联系信息 。 目前有各类成品java毕设&#xff0c;需要请看文末联系方式 …

Redis(03)List--附有示例

文章目录 reids-listBLMOVEBLMPOPBLPOPBRPOPBRPOPLPUSHLINDEXLINSERTLLENLMOVELMPOPLPOPLPOSLPUSHLPUSHXLRANGELREMLSETLTRIMRPOPRPOPLPUSHRPUSHRPUSHX reids-list 本文介绍了Redis中的表命令。LSET用于设置列表中指定索引位置的元素的值&#xff1b;LTRIM用于按照索引范围修剪…

取消调休?这个公司好像知道员工要什么...

今年的五一小长假3天变5天&#xff0c;比以往多2天&#xff0c;但是为了多出来的这两天&#xff0c;前一个周末的周日&#xff0c;也就是本周的周日4月23日&#xff0c;要正常上班一天。 五一回来后的5月6日&#xff0c;也就是回来后的那个周六&#xff0c;也要上班&#xff0…

测试参持之以恒兵勋章活动

测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动 测试参加勤写标兵勋章活动…

【Spring篇】Spring入门案例

&#x1f353;系列专栏:Spring系列 &#x1f349;个人主页:个人主页 目录 一、IOC入门案例 1.入门案例思路分析 2.入门案例代码实现 二、DI入门案例 1.入门案例思路分析 2.入门案例代码实现 三、图书推荐 介绍完Spring的核心概念后&#xff0c;接下来我们得思考一个问题…

重写equlas时为什么一定要重写hashcode方法?

equals方法和hashCode方法都是Object类中的两个基本方法&#xff0c;它们共同来判断两个对象是否相等。为什么要两个方法结合起来使用呢&#xff1f;原因是在 ‘性能’ 上面。 使用过 hashMap 我们知道&#xff0c;通过 hash 计算 &#xff0c;可以快速的在常量时间内找到某个…

Java设计模式你了解多少

Java设计模式是一种为解决软件设计中常见问题而编写的通用重复解决方案。这些问题涉及到对象创建、组合对象以形成更复杂的对象、组织和管理对象之间的关系以及在系统运行时动态地切换对象的行为等方面。Java设计模式已经被广泛应用于软件开发领域&#xff0c;并且在现代软件开…

文本聚类与摘要,让AI帮你做个总结

你好&#xff0c;我是徐文浩。 过去的十多讲里&#xff0c;我为你介绍了各种利用大语言模型的方法和技巧。特别是在过去两讲里&#xff0c;我们也尝试更加深入地利用开源代码帮我们完成一些工作。通过llama-index这样的开源库&#xff0c;我们能够将自己的数据和大语言模型连接…

JavaScript中如何删除对象/数组中null、undefined、空对象及空数组实例代码

如下&#xff0c;对于一个多层嵌套的数据结构&#xff1a;例如 要做的就是删除所有value为空&#xff0c;数组为空&#xff0c;对象为空的字段 const querys {name: 测试,httpMethod: ,httpHeaders: [{key: Accept,value: test,},],restParams: [{key: ,value: ,},],body: {b…

markdown基本语法

来自神秘人儿的投稿&#xff01; markdown的使用&#xff0c;可以参考https://markdown.com.cn/basic-syntax/ 标题&#xff1a;用 # 表示 段落&#xff1a;enter即可&#xff0c;两端之间有一个空行 换行&#xff1a;一行的末尾加两个或者多个空格&#xff0c;两端之间没有…

Python双向循环链表的操作

目录 一、双向循环链表 双向循环链表图 二、双向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…

Java 并发工具合集 JUC 大爆发!!!

并发工具类 通常我们所说的并发包也就是 java.util.concurrent (JUC)&#xff0c;集中了 Java 并发的各种工具类&#xff0c; 合理地使用它们能帮忙我们快速地完成功能 。 1. CountDownLatch CountDownLatch 是一个同步计数器&#xff0c;初始化的时候 传入需要计数的线程等待数…

js和jQuery知识点总结

目录 一.jQuery知识点梳理 1.jQuery入门&选择器 案例1 表格隔行换色 二.$工具方法&属性&CSS 案例2&#xff1a;实现全选功能 三.筛选&过滤&位置 案例3.实现返回顶部功能 四.事件&效果 二.JavaScript知识点梳理 一.js核心语法 二.函数和wind…

29考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略MATLAB程序-日前日内实时+需求响应+协调调度

资源地址&#xff1a; 29考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略MATLAB程序-日前日内实时需求响应协调调度-Matlab文档类资源-CSDN文库 参考文献&#xff1a; 考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略——金力 主要内容&…

【数据聚类|深度聚类】Heterogeneous Tri-stream Clustering Network(HTCN)论文研读

文章目录 AbstractIntroductionRelated WorkDeep ClusteringSelf-supervised LearningProposed FrameworkFramework OverviewInstance-level ContrastivenessCluster-level ContrastivenessOverall Loss FunctionImplementation DetailsExperimentsDatasets and Evaluation Met…

尚硅谷_宋红康_第17章_反射机制

第17章_反射机制 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.ge…

AgentGPT,免费易用的 Auto-GPT 平替

你问 ChatGPT 答&#xff0c;属于单线问答式交互。但如果你问Auto-GPT&#xff0c;他会分解成N个任务&#xff0c;并且在遇到任务无法完成后&#xff0c;会尝试其它的方式来完成任务&#xff0c;很像老板交待你一个任务&#xff0c;中间的过程他不过问&#xff0c;遇到问题你自…