Python中的for循环、迭代器与生成器
for循环是每个编程语言中必不可少的流程控制语句。在Python中,for用于遍历一个迭代对象的所有元素。循环内的语句会对每个元素都执行一次,类似遍历一个集合。
简单的遍历,如下,该for循环将list中的每个数字打印了一遍:
语法:
for element in iterable: statements(s)
iterable即迭代对象,当一个迭代对象作为参数传给iter()方法时,会返回一个迭代器对象:
迭代器
迭代器在Python中被定义为一个表现为流式数据的对象。
将对象传递给内置的next()方法时,它会从与之关联的流式数据中返回下一个值,一旦所有数据都遍历结束,就会抛出一个”StopIteration“异常
迭代器遍历元素的过程
当一个循环开始时,首先会获取它的迭代器。for循环会调用该迭代器的__next__()方法,获取迭代器的下一个元素,并执行代码块中的语句。当next到最后发现Stopiteration异常时,循环结束
iter()方法要求传入的是可迭代对象,才会返回一个迭代器。而产生的迭代器也同样是一个迭代对象(因为迭代器本身支持迭代器协议),它同样可以被iter(0方法所迭代,得到另一个迭代器。
它和普通迭代对象(如list列表)不同的是,普通迭代对象传入iter(),每次都返回不同的迭代器,而在迭代器上调用iter(),都是返回同一个迭代器(地址是同一个)
这里有几个简单的概念需要了解一下:
迭代:即逐个获取元素的过程,也可以叫遍历
可迭代:即实现了__iter__方法的对象。基本上Python中的有序列表都是可迭代的。
迭代器:即实现了__next__方法的对象。使用next(),迭代器会返回下一个值,若没有返回的值了,则返回Stopiteration异常。
迭代器与普通列表的区别在于,列表会将所有元素一次性加载到内存,而迭代器以延迟计算的方式返回元素,即按需调用。在for循环中,通过不断调用迭代器的next方法,实现遍历
生成器
当对有规律的列表进行操作,那么我们可以无需一次性生成所有元素,而是元素边用边生成的方式来处理,减小了资源的占用,也feel更upper一些。
这个定义听起来和迭代器没有什么差异,先来看一下如何得到一个生成器吧:
1.使用生成器函数
普通函数使用return返回值,而生成器函数使用yield来返回值,返回的对象就是一个生成器对象,生成器本质上就是一个迭代器,因此与迭代器有相同的特性
调用生成器函数时并执行时,此处的yiels会挂起该函数,并向调用者返回一个值,但保留足够的状态使得函数能从它离开的地方继续。
当继续时,函数在上一个yield返回后立即继续执行。从函数的角度看,yield允许了代码按时间产生一系列值,而不是一次性计算并返回给调用者。
2.生成器表达式
与列表生成式非常相似,仅仅把 [ ] 改成了 ( ) ,二者返回的对象不同。(图中错误请忽略)
至于迭代器与生成器的不同之处,网上的文章并没有什么多余的解释。
在《Python学习手册 第四版》中,同样说到这个话题,但从字里行间可以看得出来,这两个概念没有严格的区分,迭代器偏向描述一个对象的可迭代性;而生成器则添加了一个挂起的功能
本文来自博客园,作者:我永远喜欢石原里美,转载请注明原文链接:https://www.cnblogs.com/yuan-zhou/p/16023958.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构