Python 入门 05 —— 迭代、迭代对象、迭代器

迭代这个词并不是Python语言才有的,几乎所有的计算机语言都会涉及到它。在Python语言中它会经常被提到。

一、什么是迭代
迭代,iterate(V. 重复,反复申明)。比较正规的定义是:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

在Python 我们通常需要从一群数据(容器)中逐一取出其中的每一个数据进行操作,这个逐一取出的过程,被称为遍历,也叫迭代。

可以被逐一取出,就叫可迭代,不能被逐一取出,就叫不可迭代。一袋米是可迭代的,一桶水就是不要迭代的。

二、什么是可迭代对象
能够从对象中逐一取出元素进行操作的对象,就是可迭代对象。不过这样说是不严格的。严格地说是:定义了__iter__函数的对象就是可迭代对象。当然,要想能够实现从对象中逐一取出元素,这个__iter__函数是必须按要求正确定义,否则,“可迭代对象”只能是徒有虚名。

字符串、列表、元组、字典等都是可迭代对象。

可迭代对象,可以通过for in 这样的语句遍历元素。

三、什么是迭代器
迭代器,又称迭代器对象。定义了__iter__和__next__这两个函数的对象就是迭代器对象。因为迭代器对象定义了__next__,通过调用__next__就可以实现元素的遍历了。

for in 这样的语句在运行时要查看操作的对象中有没有__iter__函数,有才运行,没有则报错。因此,如果不规定迭代器对象也必须定义__iter__函数,那么迭代器对象就只能用__next__方法遍历元素,而不能用for in 这样的语句来遍历元素。为了方便迭代器对象也能适用于for in 这样的语句,所以,规定迭代器对象也必须定义__iter__函数。这就是相当于为了让克里姆林宫门口的卫兵有一个统一的检查标准,列宁也需要一个通行证一样。列宁的通行证仅在进大门时用一下,进了克里姆林宫估计就不会再有人去检验他的身份了,所以,列宁的通行证上职务、出身年月等信息可以为空。同样,迭代器对象的__iter__函数中仅有返回迭代器对象本身这一句即可,其它的语句可一概省略。

因为迭代器对象也有__iter__函数,所以,迭代器对象一定是可迭代对象。

一个可迭代对象定义了__next__函数就变成了迭代器对象,没有定义__next__函数就不是迭代器对象。那没有定义__next__函数的可迭代对象是如何实现迭代的呢?通常这样的对象都是定义了getitem这样的函数以实现迭代。

可迭代对象通过iter()函数可以转换成迭代器对象,即有:迭代器对象 = iter(可迭代对象) 。

当参数是已经有了__next__函数的可迭代对象时,iter()函数应该是什么也不做。因为“已经有__next__函数的可迭代对象”本身就是迭代器对象了。也就是,当参数是迭代器对象时,iter()函数什么也不做,返回参数本身。

当参数是没有__next__函数的可迭代对象时,iter()函数应该是根据类似getitem这样的函数制作一个__next__函数添加到可迭代对象中,并返回。

四、迭代与递归
从直观上讲,递归是将大问题化为相同结构的小问题,从待求解的问题出发,一直分解到已经已知答案的最小问题为止,然后再逐级返回,从而得到大问题的解。而迭代则是从已知值出发,通过递推式,不断更新变量新值,一直到能够解决要求的问题为止。

递归必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。
迭代是逐渐逼近,用新值覆盖旧值,不保存中间值,空间利用率高。

举个例子,一个大米桶内剩余有N粒米,放一个每天吃5粒米的老鼠进去吃,以求得N值到底是多少。递归的办法就是,每天去看有没有吃完,没有吃完就在日历上勾一下,等到吃完哪天再来数天数,求N值。迭代的办法就是,每天去看有没有吃完,第一天没吃完就写上5,第二天没吃完,就将5改写为10,天天看,天天算,直到结束。

———————————————— 本篇完 ————————————————

看完之后,麻烦您顺手点击下方 “点赞” 两个字给我点个赞吧 ^-^ , 谢谢您了。

如果您还能像我小学一年级班主任好老师那样,给我随心写上几句表扬或批评的话语,那真是感激不尽!

在我人生的道路上,有了您的鼓励和指导,我一定成长快快。

发布了28 篇原创文章 · 获赞 6 · 访问量 2285

猜你喜欢

转载自blog.csdn.net/Jeff888999/article/details/103901268
今日推荐