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

news/2024/5/17 19:28:33

文章目录

    • 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.mrgr.cn/p/82408470

相关文章

图文并茂手把手教你MAC运行.net项目(Visual Studio 配置c# .net环境 运行solution)

下载Visual Studio 点击这里直达官网安装Visual Studio开启项目(如果你有现成的项目) 如果没有现成的项目,可以参考下一个步骤进行测试哦 选择.sln点击键盘F5,启动项目 观察Application Output, 项目启动成功结语今天就写到这里啦~ 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ…

响应式修改 页面字体字号【大 中 小 】

浅浅记录下&#xff0c;工作中遇到的问题&#xff0c;修改页面文本字号。 <p class"change_fontSize">[ 字号 <a href"javascript:doZoom(18)">大</a><a href"javascript:doZoom(16)">中</a><a href"ja…

Redis 缓存预热、预热数据选取策略、缓存保温、性能边界

缓存预热 热点数据预热&#xff1a;根据业务分析或统计数据&#xff0c;确定热点数据&#xff08;经常被访问的数据&#xff09;&#xff0c;并将其提前加载到Redis缓存中。可以根据访问频率、访问量或其他业务指标来确定热点数据。定时预热&#xff1a;可以设置定时任务&…

Google搜索技巧

来源:零度解说 附加:深度精简 Edge浏览器! 1、以图搜片2、搜索特定文件类型 比如要搜索GPT-4来搜索相对应的PDF奇数文档,后面只需要跟上“文件类型 + :pdf”通过这种方法可以搜索任何文档,只需要在某好后面加上文档后缀就可以了。通过这种方法可以快速定位到我们需要的电影…

每帧纵享丝滑——ToDesk云电脑、网易云游戏、无影云评测分析及ComfyUI部署

目录 一、前言二、云电脑性能测评分析2.1、基本配置分析2.1.1、处理器方面2.1.2、显卡方面2.1.3、内存与存储方面2.1.4、软件功能方面 2.2、综合跑分评测 三、软件应用实测分析3.1、云电竞测评3.2、AIGC科研测评——ComfyUI部署3.2.1、下载与激活工作台3.2.2、加载模型与体验3.…

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…

Linux知识

基础 Linux系统的组成 Linux内核、Linux⽂件系统、Linux shell、Linux应⽤程序。 Linux的开机启动过程 u-boot是⼀款常⽤的开源Bootloader&#xff0c;它的启动顺序如下&#xff1a; CPU上电后&#xff0c;⾸先执⾏boot ROM&#xff08;引导ROM&#xff09;代码。boot ROM…

Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术

Java全套智慧校园系统源码springbootelmentui Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术 智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境&#xff0c;这个一体化环境以各种应用服务系统为载体&#xff0c;将教学、科研、管理和校园…

Nacos的一些高级功能

【BV1q3411Z79z】zhouyu:临时实例和持久实例,保护阈值,权重,NacosRule配置权重,Cluster就近访问高级功能 临时实例和持久实例 默认情况下,注册给Nacos的实例都是临时实例 临时实例:会通过客户端与服务器之间的心跳来保活,默认情况下客户端每隔5s发送一次心跳 public st…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

Jmeter 测试Dubbo接口-实例

1、Dubbo插件准备 ①把jmeter-plugins-dubbo-2.7.4.1-jar-with-dependencies.jar包放在D:\apache-jmeter-5.5\lib\ext目录 ②重新打开Jmeter客户端 在线程组-添加-取样器-dubbo simple&#xff0c;添加dubbo接口请求 2、Jmeter测试lottery接口 ①配置zookeeper参数 由于dub…

重生之我在男航学Java-1

一、前言第一次题目集主要是让我们熟悉对类的使用和对单一职责的理解,由于给出了设计建议,并且内部给出了具体的设计分析,第一次PTA的题量大但是难度并不是很大,虽然老师说了可以使用正则表达式,但我由于自身的懒惰附加c语言面向过程的思想根深蒂固,我在第一次PTA中并未使…

PHP 安装开启redis扩展

方法1,通过pecl 安装 pecl install redis 方法2, 源码编译安装 github地址 https://github.com/phpredis/phpredis/blob/develop/INSTALL.md 也可以参考菜鸟教程 https://www.runoob.com/redis/redis-php.html 安装完成后重启php-fpm 或 apache。查看phpinfo信息,就能看到redi…

datawhale-动手学图深度学习task03

动手学图深度学习 声明:本文是在笔者的Pytorch tutorial及深度学习入门(鱼书)笔记的基础上继续学习记录,故有些内容略过。 第三章:深度学习基础 神经网络及其基本组成的补充欠拟合: 训练误差和验证误差都很严重,而且他们间仅有一点差距,如果模型不能降低训练误差,这可能…

23201115-邓俊豪的第一次blog

目录PTA三次大作业前言关于难度和题目量关于知识点设计与分析第一次大作业题目我的代码分析报告第二次大作业题目我的代码分析报告第三次大作业题目N:1 #Q:1+1= #A:2N:2 #Q:2+2= #A:4T:1 1-5 2-8X:20201103 Tom-20201104 JackS:1 20201103 #A:1-5 #A:2-4D:N-2N:1 #Q:1+1= #A:2T…

bilibili PC客户端架构设计——基于Electron

众所周知&#xff0c;bilibili是个学习的网站&#xff0c;网页端和粉版移动端都非常的好用&#xff0c;不过&#xff0c;相对其它平台来说bilibili的PC客户端也算是大器晚成了。在有些场景PC客户端的优势也是显而易见的&#xff0c;比如&#xff0c;跓留电脑桌面的快捷、独立的…

如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事。但是在某些场景下 SSR 还是有意想不到效果。比如某些静态页面,比如追求首屏加载速度的时候。最近在项目中回归传统效果还是不错。 有的时候我们希望…

Scala 03 —— Scala Puzzle 拓展

Scala 03 —— Scala Puzzle 拓展 文章目录 Scala 03 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

2001-2022上市公司数字化转型数据(含原始数据+计算代码+计算结果)

2001-2022上市公司数字化转型数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2001-2022年 2、来源&#xff1a;原始数据整理自wind 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、是否发生暂停上市、行业代码、…

aardio 两行代码 调用 libxl 读写 excel

废话不多说, 直接给连接 https://files.cnblogs.com/files/blogs/762462/libxl.7z?t=1713539927&download=true 运行效果:文件存放路径:再上代码 import dotNet import consolexl = dotNet.load("libxl.net", "libxl.net.dll"); xl.import("libx…