要先搞清楚这三者区别首先需要给文章 点个赞 。呸呸呸,说错了,需要先弄明白什么是迭代,先补充一下迭代的概念在进入正题的讲解。
迭代:像list,tuple,dict这样的数据类型,我们通过for...in...语法从中依次拿到数据进行使用,这样的遍历过程,就叫做迭代
正文开始
Python学习交流群:1004391443,这里有资源共享,技术解答,还有小编从最基础的Python资料到项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。
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
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1558079707321" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
当然是点赞啊,哈哈哈哈
网友评论