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学习手册 第四版》中,同样说到这个话题,但从字里行间可以看得出来,这两个概念没有严格的区分,迭代器偏向描述一个对象的可迭代性;而生成器则添加了一个挂起的功能

 

posted @   我永远喜欢石原里美  阅读(1637)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示