Python中的迭代器:深入理解与实用指南

文章目录

    • 1. 迭代器的基本概念
    • 2. Python中的迭代器实例
    • 3. 自定义迭代器
      • 3.1 例子
      • 3.2 详细过程
    • 4. 迭代器的高级应用
    • 5. 常见问题与解答

迭代器是Python中非常核心的概念之一,在面试中也会被问到。下面我会详细介绍什么是迭代器,使用方法,以及使用自定义迭代器来优化代码。

1. 迭代器的基本概念

在Python中,迭代器是实现了迭代器协议的对象,即它们具备了__iter__()__next__()这两个方法。__iter__()方法返回迭代器对象本身,而__next__()方法则返回容器中的下一个元素。当容器中没有更多元素时,__next__()会抛出一个StopIteration异常来通知迭代终止。

示例图:

在这里插入图片描述

示例代码:

numbers = [1, 2, 3]
iter_obj = iter(numbers)  # 创建迭代器对象
print(next(iter_obj))  # 输出: 1
print(next(iter_obj))  # 输出: 2
print(next(iter_obj))  # 输出: 3
try:print(next(iter_obj))  # 超出范围,将抛出StopIteration异常
except StopIteration:print("迭代完成")

通过这个简单的例子可以看到迭代器如何在Python列表上工作,以及当所有元素被遍历完毕后如何正确地处理StopIteration异常。

2. Python中的迭代器实例

许多内置数据类型在Python中都支持迭代器,例如列表、元组、字典和集合等。此外,文件对象也是可迭代的,这使得读取文件变得极为便捷。

示例代码:

# 迭代字典
my_dict = {"apple": "red", "banana": "yellow", "cherry": "red"}
for key in my_dict:print(f"{key}: {my_dict[key]}")# 文件迭代
with open("example.txt", "r") as file:for line in file:print(line.strip())

例子说明:

  • 通过在字典my_dict上使用for循环,直接迭代访问了其所有键,并打印出相应的键值对。
  • 打开了一个文件,并使用for循环逐行读取,这里文件对象自身就是一个迭代器,它按需加载数据,非常适合读取大文件。

3. 自定义迭代器

创建自己的迭代器:这需要定义一个类并实现__iter__()__next__()方法。可以让对象支持迭代,提供更多的灵活性和功能。

3.1 例子

class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current > 0:num = self.currentself.current -= 1return numraise StopIteration# 使用自定义迭代器
counter = CountDown(3)
for num in counter:print(num)  # 输出: 3, 2, 1

这个自定义迭代器CountDown从一个指定的起始数开始向下倒数。每次调用__next__()方法时,它检查当前数是否大于0,如果是,则返回当前数并将其递减,直到达到0时抛出StopIteration异常,表明迭代结束。

3.2 详细过程

我觉得有必要分析一下这个代码的详细执行过程

当创建CountDown类的一个实例(counter = CountDown(3)),只有__init__方法被立即执行。__iter__方法是在迭代器被实际用于迭代时才调用,通常是在for循环或其他形式的迭代开始时。下面详细说明这个过程:

  1. 创建实例:当执行counter = CountDown(3)时:

    • __init__(self, start)方法被调用,其中selfCountDown的一个新实例,start是传入的参数3。

    • __init__方法内,实例的current属性被设置为3,初始化完成后,__init__方法结束。

  2. 开始迭代:当for num in counter:执行时:

    • 首先尝试获取counter对象的迭代器,这会自动调用counter.__iter__()方法。

    • CountDown类中,__iter__()方法定义为返回自身(return self),因此counter本身作为迭代器参与迭代过程。

    • 现在counter已经准备好按需返回值,等待for循环调用__next__()

  3. 迭代过程:for 循环调用counter.__next__()

    • 检查current的值是否大于0。

    • 如果大于0,返回current的当前值,并将current减1。

    • 如果current已经为0,__next__()方法抛出StopIteration异常,通知for循环迭代已结束。

现在对实例的创建和迭代过程应该很清晰了,__init__方法在实例创建时执行来设置初值,而__iter____next__则是在迭代实际发生时调用。__iter__返回迭代器(这里是实例自身),并且__next__用于在每次迭代中逐步递减计数,直到抛出StopIteration

4. 迭代器的高级应用

迭代器不仅可以用于简单的数据遍历,还可以用于更复杂的数据处理任务,如在数据流中实现映射和过滤操作。

示例代码:

# 使用迭代器实现一个简单的map-reduce
nums = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, nums)
total = sum(squared)
print(total)  # 输出: 55

上面使用了map()函数,它本身返回一个迭代器。map()应用了一个函数到nums列表的每个元素上,将每个元素平方。然后使用sum()函数直接求出所有平方数的总和。

5. 常见问题与解答

Q: 迭代器和生成器有什么区别? A: 生成器是一种特殊类型的迭代器,可以通过函数来实现,使用yield语句返回每次迭代的值。生成器通常用于更复杂或更大数据集的惰性处理。

Q: 为什么要使用迭代器? A: 迭代器提供了一种统一的方法来逐个访问集合中的元素,而不需要知道集合的内部结构。它们还有助于保持代码的可读性和内存效率,特别是处理大型数据集时。


参考:What are Iterators and Iterables in Python

推荐:

  • python 错误记录
  • python 笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么转行做产品经理?

小白转产品经理第一点要先学基础理论知识,学了理论再去实践,转行,跳槽! 学理论比较好的就是去报NPDP的系统班,考后也会有面试指导课、职场晋升课程,对小白来说非常合适了~(B站:不爱…

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …

『FPGA通信接口』串行通信接口-IIC(2)EEPROM读写控制器

文章目录 1.EEPROM简介2.AT24C04简介3.逻辑框架设计4.随机读写时序5.仿真代码与仿真结果分析6.注意事项7.效果8.传送门 1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory) 是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入…

uniapp项目中表单输入完整项之后提交按钮颜色高亮显示并触发点击事件

1.效果图&#xff1a; 2.html <view class"add" :style"{background: dynamicBackgroundColor, border-color: white}" click"handleClick">添加新地址 </view> 3.js formData: {name: ,phoneNumber: ,addressDetail: }//利用com…

JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)

常用命令&#xff1a;jps、jinfo、jstat、jstack、jmap jps jps查看java进程及相关信息 jps -l 输出jar包路径&#xff0c;类全名 jps -m 输出main参数 jps -v 输出JVM参数jps命令示例 显示本机的Java虚拟机进程&#xff1a; # jps 15729 jar 92153 Jps 90267 Jstat显示主类…

嵌入式Linux:Linux系统文件目录说明

在Linux系统中&#xff0c;系统文件和目录按照一定的约定被组织和分配到不同的位置。这些文件和目录通常用于存储系统配置、程序文件、库文件等。 以下是一些常见的系统文件目录及其用途的详细说明&#xff1a; /bin:存放系统中最基本的命令&#xff08;二进制文件&#xff09;…

YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构&#xff0c;其是一种为白细胞检测设计的网络结构&#xff0c;主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分&#xff1a;特征选择模块和特征融合…

【单调栈】力扣85.最大矩形

好久没更新了 ~ 我又回来啦&#xff01; 两个好消息&#xff1a; 我考上研了&#xff0c;收到拟录取通知啦&#xff01;开放 留言功能 了&#xff0c;小伙伴对于内容有什么疑问可以在文章底部评论&#xff0c;看到之后会及时回复大家的&#xff01; 前面更新过的算法&#x…

《QT实用小工具·三十二》九宫格炫酷主界面

1、概述 源码放在文章末尾 项目实现了九宫格炫酷主界面&#xff0c;下面是项目demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h"frmMain::frmMain…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

jsoup接收429,404错误用来接收json格式

1.代码用例 try { // 拿到当前剩余余下的钱Document doc Jsoup.connect(url).header("Authorization", "Bearer " apiKey).header("Content-Type", "application/json").header("Connection", "keep-aliv…

就业班 第三阶段(nginx) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

VirtualBox Manjaro Linux(kde)虚拟机扩容 增大硬盘存储空间

https://blog.csdn.net/m0_65274357/article/details/131965463 df -h发现/可用空间之后几百M了 文件系统 大小 已用 可用 已用% 挂载点 dev 2.0G 0 2.0G 0% /dev run 2.0G 1.2M 2.0G 1% /run /dev/sda1 40G 37…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁&#xff1f; A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点&#xff1a;网络安全 解析&#xff1a;&#xff08;B&#xff09; 钓鱼攻击通常被认为是应用层的安全威胁&#xff0c;也有在网络层进行伪装实施钓鱼攻击&#xff0c;…

算法复杂度分析笔记

基本定义间的关系 算法介绍 算法分析 时间复杂度 用数量级刻画&#xff1a;忽略所有低次幂项和系数 eg1: eg2: eg3: eg4: 小结 空间复杂度 eg: 总结

在Linux操作系统中,修改文件目录权限常用的命令操作

修改文件的属主或者是属组 命令chown 用户名.用户组名&#xff0c;文件路径 如上图所示&#xff0c;使用命令 chown martin.caiwu /opt/test/1.txt 将文件1.txt的属主修改为martin 。 将文件1.txt的属组修改为caiwu 如上图所示&#xff0c;使用命令chown .jishu /opt/test/…

探索早期投资的奥秘:符文(Runes)生态系统的崛起

随着加密市场的迅速发展&#xff0c;投资者们对早期项目的关注越来越高。在这个充满变数和机遇的领域里&#xff0c;抢占先机意味着可能获得巨大的回报。符文&#xff08;Runes&#xff09;生态系统作为近期备受瞩目的项目之一&#xff0c;引发了众多投资者的兴趣。本文将深入探…

JAVA面向对象(下)(三、接口和代码块)

一、接口&#xff08;难点、重点&#xff09; 1.1 需求 声明一个抽象父类Animal&#xff0c;包含public abstract void eat(); 声明一个子类Bird&#xff0c;继承Animal&#xff0c; 重写eat方法 新增一个方法&#xff1a;public void fly() 声明一个Plane&#xff0c;没有…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中&#xff0c;有几个库可以用于视频播放&#xff0c;但是没有一个库是完美的&#xff0c;因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器&#xff0c;再介绍用Python实现本地音乐播放器。 Python实现…

【御控物联】Java JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…