深入理解python的迭代器,生成器,可迭代对象区别

栏目: Python · 发布时间: 5年前

内容简介:要先搞清楚这三者区别首先需要给文章迭代:像list,tuple,dict这样的数据类型,我们通过for...in...语法从中依次拿到数据进行使用,这样的遍历过程,就叫做迭代简单来说,某个对象内部具有__iter__方法,那么它就是可迭代对象(Iterable)。

要先搞清楚这三者区别首先需要给文章 点个赞 。呸呸呸,说错了,需要先弄明白什么是迭代,先补充一下迭代的概念在进入正题的讲解。

迭代:像list,tuple,dict这样的数据类型,我们通过for...in...语法从中依次拿到数据进行使用,这样的遍历过程,就叫做迭代

正文开始

1,可迭代对象

简单来说,某个对象内部具有__iter__方法,那么它就是可迭代对象(Iterable)。

全剧终!事情并不是这么简单,作为一个有追求的 程序员 我们需要深入了解一下 可迭代对象的本质是什么?

我们分析我们在对可迭代对象进行迭代的时候,迭代一次(就是在for...in...中循环一次),都会返回一个值,直到将可迭代对象中的所有值取完。

那么问题来了,是不是存在一个“人”记录了什么时候访问到了第几个数据。答案是肯定的,这个“人”就是 迭代器(Iterator)

可迭代对象的本质就是提供这样个迭代器帮助我们进行迭代遍历使用

可迭代对象就是通过__iter__方法向我们提供这样一个迭代器,在迭代一个可迭代对象的时候,首先就是获取该对象的迭代器,然后利用该迭代器对可迭代对象中的数值进行迭代。

综上所述,一个具备了__iter__方法的对象,就是一个可迭代对象。

接下来进入迭代器的讲解,我们再补充一点概念性的东西

iter()函数与next()函数

list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。

然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。

iter()函数实际上就是调用了可迭代对象的__iter__方法。

当序列遍历完时,将抛出一个StopIteration异常。这将使迭代器与循环兼容,因为它们将捕获这个异常以停止循环。 要创建定制的迭代器,可以编写一个具有next方法的类。

2,迭代器

通过上面的分析,相信你已经掌握了迭代器就是帮我记录每次迭代访问的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。

实际上我们使用的next函数,调用的就是迭代器对象的__next__方法(python3中是__next__方法,python2中是next()方法)

所以我们想要构造一个迭代器就是要实现他的__next__方法,但是实现__next__方法还远远不够,python要求迭代器自身也是可以进行迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。

是不是像一个绕口令,十分难记,简答来说

迭代器就是 一个实现了__iter__和__next__方法的对象

通过以上讲解,你需要明白的一些结论

如果一个对象拥有__iter__方法,那么它是可迭代对象;

如果一个对象拥有next方法,其是迭代器;

定义可迭代对象,必须实现__iter__方法;

定义迭代器,必须实现__iter__和next方法;

迭代器一定是可迭代对象,反过来则不一定成立。用iter()函数可以把list、dict、str等Iterable变成Iterator

3,生成器

进入到今天的最后一个话题。激动!(一不小心又掌握了一个面试必考点,圈起来)

生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

具有yield关键字的函数都是生成器,yield可以理解为return,返回后面的值给调用者。

不同的是return返回后,函数会释放,而生成器则不会。

在直接调用next方法或用for语句进行下一次迭代时,生成器会从yield下一句开始执行,直至遇到下一个yield

深入理解 <a href='https://www.codercto.com/topics/20097.html'>python</a> 的迭代器,生成器,可迭代对象区别

当然是点赞啊,哈哈哈哈


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ES6标准入门(第3版)

ES6标准入门(第3版)

阮一峰 / 电子工业出版社 / 2017-9 / 99.00

ES6是下一代JavaScript语言标准的统称,每年6月发布一次修订版,迄今为止已经发布了3个版本,分别是ES2015、ES2016、ES2017。本书根据ES2017标准,详尽介绍了所有新增的语法,对基本概念、设计目的和用法进行了清晰的讲解,给出了大量简单易懂的示例。本书为中级难度,适合那些已经对JavaScript语言有一定了解的读者,可以作为学习这门语言最新进展的工具书,也可以作为参考手册......一起来看看 《ES6标准入门(第3版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试