Python 迭代器与生成器的区别

全面理解Python中的迭代器 迭代是一种重复获取数据集合中元素的过程,一次只获取一个元素,直到遍历完所有元素。在Python中,迭代通常用于遍历序列(如列表、元组)或任何可迭代对象。自定义迭代器允许我们创建自己的数据结构并以迭代方式访问其内容。在Python中,最常见的方式是通过生成器函数来实现。生成器函数是一种特殊的迭代器,使用yield语句暂停和恢复函数的执行。# 使用自定义迭代器print(num)itertools模块包含了许多有用的迭代器函数,如count()cycle()chain()等。例如,count()break。 阅读详情
AI摘要

本文详细解析了Python中迭代器与生成器的概念与实现方式,包括如何使用类实现迭代器,以及如何利用函数和yield关键字创建生成器,并对比了两者之间的主要区别。

先说结论:

① 所有的生成器都是迭代器.

② 迭代器(iterator)用类实现, 生成器(generator)用函数实现

Python 中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象(如: tuple, list, dict)

 1.迭代器

迭代器的实现是基于类, 要使得类的实例是一个迭代器, 需要满足2个条件.

  1. 定义一个__iter__方法,  内容要 return self 
  2. 定义一个__next__方法(Python 2中 是 next  方法) 

一个代码实例:

In [1]: class Squares(object):
   ...:     def __init__(self, start, stop):
   ...:        self.start = start
   ...:        self.stop = stop
   ...:     def __iter__(self): 
   ...:        return self
   ...:     def __next__(self): # next in Python 2
   ...:        if self.start >= self.stop:
   ...:            raise StopIteration
   ...:        current = self.start * self.start
   ...:        self.start += 1
   ...:        return current

In [2]: iterator = Squares(1, 4)

In [3]: next(iterator)
Out[3]: 1
In [4]: iterator.__next__()
Out[4]: 4
In [5]: next(iterator)
Out[5]: 9
In [6]: next(iterator)
---------------------------------------------------------------------------
StopIteration

 如上代码, 定义一个类Squares, 实现__iter__和__next__方法, 该类的一个实例iterator就是一个迭代器, 可以对其使用关键字next来依次获取迭代器中的内容(即调用__next__函数). next(iterator) == iterator.__next__()

可以使用关键字iter() 将一个Iterable对象转换成迭代器.

In [7]: iterator = iter([1,2,3,4,5])

In [8]: next(iterator)
Out[8]: 1
In [9]: next(iterator)
Out[9]: 2

2. 生成器

生成器可以认为是一个简化版的迭代器, 生成器的实现是基于函数. 再函数中使用关键字“yield” 而不是通常用的return. yield作为生成器执行的暂停恢复点, 每次调用next, 生成器函数执行到yield语句, 会挂起,并保存当前的上下文信息. 知道下一个next触发生成器继续执行.

使用生成器来实现之前的Squares迭代器

In [1]: def squares(start, stop):
   ...:     for i in range(start, stop):
   ...:         yield i * i

In [2]: generator = squares(1, 4)

In [3]: next(generator)
Out[3]: 1
In [4]: next(generator)
Out[4]: 4
In [5]: next(generator)
Out[5]: 9
In [6]: next(generator)
---------------------------------------------------------------------------
StopIteration

如上例代码可见, 函数squares返回的是一个生成器.

第一次调用next(generator) for 循环遍历到 i=1, 然后通过yield返回当前值 1, 函数被挂起. 

第二次调用next(generator) for 循环继续执行, 遍历到 i=2 然后通过yield返回当前值 4, 函数再次挂起.  

直到遍历结束, 抛出StopIteration 异常

可以在函数中使用 while True语句, 返回永远不会结束的生成器

3. 对比

迭代器 Iterator生成器 Generator

用类实现

用函数实现

迭代器使用 iter() 和 next() 函数 生成器使用 yield 关键字
每个生成器都是一个迭代器
ESP32-IDF开发之旅 网络篇⑩ Web配网 本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。 阅读详情

相关推荐

模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

整理的算法模板合集: ACM模板 目录一、树的直径树形DP两次DFS / BFS(找到直径的两个端点)二、动态修改树的边权并求每个时刻的直径(线段树)三、树的重心 一、树的直径 树的直径满足如下性质: 若有多条直径,则所有的直径之间皆有公共点。 直径的两端一定是叶子。 树中距离某一直径端点最远的点,至少有一个是该直径的另一个端点。 对于树上任意一个点,与之距离最远的一个点,至少有一个直径的端点。 给你一个无权无向的树。编写程序以输出该树中最长路径(从一个节点到另一个节点)的长度。在这

繁凡さん的博客 1676

python迭代器与生成器的区别

迭代器与生成器的区别:

yekuishu的专栏 5654

Anaconda详细安装及使用教程(带图文)

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。 Conda是一个开源的包、环境管理器,可以用于...

代码帮 186万+

python中生成器与迭代器到底有什么区别?一文带你彻底搞清楚

目录前言迭代器生成器二者区别生成器的巧妙使用后记 前言 为什么会有这篇文章? 今天我的同事w君问我,你知道生成器和迭代器的区别吗。我一时不怎么能说清楚,这时候网上搜一些文章,发现写的大都是介绍两种,而并没有过多解释区别。 经过自己一般翻阅资料及理解与探索,我觉得这篇文章是可以解释清楚两种对象的区别的。 当然在介绍区别之前,我也帮大家回忆一下迭代器与生成器的定义。 迭代器 我们先来看一段代码 list1 = [1,2,3] for i in list1: print(i) 1 2 3 这是初学者也

达达的博客 2万+

Postman账号

Postman账号一、为什么要注册一个Postm账号二、如何注册Postman账号三、登录账号四、切换账号五、找回账号密码 一、为什么要注册一个Postm账号 注册Postman账号是免费的。当注册并登录一个Postman账号后,用户可以获得一下权限。 (1)同步和备份历史、集合、环境和预置头。 (2)可以轻松处理来自不同机器的多个Postman实例‘ (3)创建集合链接发送给其他开发人员。 当然,不注册也可以使用Postman。 二、如何注册Postman账号 (1)下载、安装Postman应用程序。 (

精益求精,永无止境,永远在路上! 6777

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 531

python生成器和迭代器区别

一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小括号就创建了一个生成器 list = [i for i in range(10)] print(type(list)) # <class 'list'> ...

李俊的博客 3789

一、OpenSM 架构部署及原理详解

OpenSM 是 InfiniBand 网络的核心组件,通过自动化的拓扑发现、路由计算和状态维护,确保网络的高效运行。部署时需关注配置文件参数、路由算法选择和高可用性设计,调试时可借助日志和诊断工具快速定位问题。

jundao1997的专栏 1131

【Python】Python迭代器与生成器的区别(详细讲解)

这两个示例得出的结果是相同的,但实现方式有所不同。在第一个示例中,我们使用迭代器逐个获取列表中的元素,并且计算整个平方和之后才返回结果。而在第二个示例中,我们使用生成器逐步计算每个元素的平方,并且在生成器中保留了状态,从而实现了节省内存的效果。使用迭代器时,我们一次获取并处理一个元素,而使用生成器时,我们按需生成并处理每个元素,保留了计算状态,从而能够节省内存,并且可以处理大量的数据集合。迭代器是一种通用的抽象概念,而生成器是一种特殊类型的迭代器,使用函数和yield语句来实现。

测试开发自动化 4540

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

过了B点后,由于颈缩导致的截面半径迅速减小,导致真应力迅速上升,切线斜率明显提高。假设试样原长为ε,在力的作用下伸长了dε,那么根据应变的定义,瞬时的应变为dε/ε,总的应变为瞬时应变的累计,假设在瞬时的条件下,试样受载荷变化量为 ΔF ,变化的截面积为 ΔA ,而且ΔA→0,那么瞬时的。由于原始的截面积和原始的标距长度为常数,故得到的曲线长相和拉伸力-伸长(延伸)曲线没啥区别。因为用的都是原始的截面积和原始的标距长度,故称为公称应力和公称应变。如果拉伸力→应力,伸长长度→应变,就会得到应力-应变曲线。

m0_73676887的博客 5273

学Simulink--环境感知场景实例:基于Simulink的毫米波雷达多目标跟踪仿真

本文介绍了基于Simulink的毫米波雷达多目标跟踪仿真系统,重点分析了FMCW雷达信号处理流程(Range/Doppler FFT、CFAR检测)和多目标跟踪算法(JPDA数据关联、EKF状态估计)。通过构建城市道路交叉场景,验证了系统在跟踪精度(位置误差<0.2m)、实时性(单帧处理24ms)和鲁棒性(ID切换率<5%)方面的性能优势,并提出了UKF滤波、多传感器融合等优化方向。该仿真系统为自动驾驶环境感知提供了实用的毫米波雷达跟踪解决方案。

amy_mhd的博客 92

详解 Python 生成器与迭代器 及其区别

不论是初学python还是进阶,这都是绕不开的知识点,生成器与迭代器的概念相较于其他基础概念显得晦涩难懂,知识点囊括很多方面,查阅越多的资料,头就越大,现在这加以理解归纳总结。

Yy_Rose的博客 8439

【3GPP核心网】【5G】史上最全的5G协议规范总结

物理层信道定义:TS38.211(物理层信号的生成、调制,DMRS和额外DMRS,PRACH configuration index,Point A等介绍)传输信道和控制信道的数据处理:TS38.212(包括复用,信道编码,交织,DCI,DMRS端口号等)物理层控制过程:TS38.213(同步,上行功控,随机接入,UE上报和接收控制消息的过程,SSB等)物理层测量:TS38.215(UE和网络的测量控制,UE测量能力)频率、频点相关F R1:TS38.101-1。

风云说通信 3178

Python可迭代对象,迭代器,生成器的区别

本篇文章简单谈谈Python中可迭代对象,迭代器和生成器之间的关系。刚开始我认为这两者是等同的,但后来发现并不是这样;直接抛出结论: 可迭代对象包含迭代器。 如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。 定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要手动实现两方法。 生成器在迭代的过程中可以改变当前迭代值

Nxin的小抄本 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python中生成器和迭代器的区别

Python中生成器和迭代器的区别:

IT晓可程序员之路 4万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python生成器与迭代器的区别_python 迭代器与生成器 区别

不错的讲解,生成器是一类特殊的迭代器,在循环遍历自定义容器对象时,会使用python内置函数iter()调用遍历对象的_iter_(self)获得一个迭代器,之后再循环对这个迭代器使用next()调用迭代器对象的_next_(self) 。python中生成器和迭代器的区别(代码在Python3.5下测试):迭代器定义:对于list、string、tuple、dict等这些容器对象,使用for循环...

weixin_39950824的博客 279

python迭代器和生成器区别是什么

迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或动作。生成器在调用next()函数或for循环中,所有过程被执行,且返回值。生成器是通过函数的形式中调用 yield 或()的形式创建的。迭代器可以通过 iter() 内置函数创建。生成器是一种特殊的迭代器。

hakesashou的博客 561

Python中迭代器和生成器的区别

迭代器(Iterator)」__iter__()和__next__()。__iter__()方法返回迭代器对象本身。__next__()方法返回序列中的下一个值,如果没有更多元素则抛出异常。迭代器可以通过定义类实现,也可以使用内置函数iter()将一个可迭代对象(如列表、元组等)转换为迭代器。「生成器(Generator)」生成器是一种特殊的迭代器,由使用yield关键字的函数生成。生成器函数在调用时返回一个生成器对象,该对象只能用于迭代操作。yield。

wang15510689957的博客 749

python生成器和迭代器区别_Python_生成器和迭代器的区别

迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问。今天一起从概念到代码梳理一遍,作为总结和记录。区别是:生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。基础概念迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。迭代器协议:对象需要提供next()...

weixin_39805732的博客 232

Python迭代器和生成器的区别

迭代是一种操作,比如说 for 循环,逐个获取数据的这个过程就叫做迭代。

weixin_52245535的博客 786

Python中生成器与迭代器的区别与联系

Python中易混淆概念的理解一、生成器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一、生成器 先看一下以...

qq_39806164的博客 576

python生成器与迭代器的区别_python生成器和迭代器的区别

匿名用户1级2016-10-13 回答迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义了__iter__()方法的对象,而一个迭代器必须是定义了__iter__()方法和next()方法的对象。生成器的概念要比迭代器稍显复杂,因为生成器是能够返回一个迭代器的函数,其最大的作用是将输入对象返回...

weixin_36212459的博客 2659

python 迭代器和生成器的区别

目的:区分迭代器和生成器。生成器属于一种惰性计算;属于生成器的不一定是迭代器,属于迭代器的一定是生产器; 迭代器可以next()函数进行访问,生产器通过for进行访问遍历。 # 一维情况下做赋值操作 # 生成器 从开头 ,Next,用于惰性计算 # 无任何生成初始化的开销,省内存, 用到了才计算,未用到,不计算 # yield 可控多线程 import time def func_test...

因每天学习而伟大 828

Python中迭代器和生成器的区别?

公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!...

1161

Python生成器和迭代器区别与联系

简单对比 迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己的本身,对于string、list、dict、tuple等这类容器对象,使用for循环会更加方便。在后台for语句对容器对象调用iter()函数,iter()是Python内置函数。 iter()会返回一个定义了next()方法的迭代器对象,在容器中逐个访问容器内元素,next()也是Python的内置函数,无后续元素时,next()会抛出一个StopIteration异常 生成器是创建迭代器简单而强大的工具,像正规

frighting_ing的博客 1390

python 生成器 迭代器 的区别

1)可迭代对象包含迭代器。 2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。 3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 4)具备可迭代性,那么就可以直接用for循环 问题1:具备可迭代性的元素,就一定是迭代器吗? 答案:不一定 验证如下: from collections im...

嘎嘎_哈 383

Python_生成器和迭代器的区别

迭代器和生成器的区别是什么?这个问题面试的时候经常被作为灵魂拷问。今天就一起从概念到代码梳理一遍,作为总结和记录。 区别是: 表面上是同一个东西, 基础概念 迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。 列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。 迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。 可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),

钢铁知识库 507
上一篇: Python 中的深拷贝deepcopy与浅拷贝copy
下一篇: Python中的*args和**kwargs理解
be5yond
博客等级 码龄10年 590粉丝 123原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值