作为一个被学校老师水到不得了(外加上课好好自学被扣表现分等一系列令人。。。的事)的新手小白,总是被迫自己通过查资料和整理来巩固知识。
哎,命苦啊,希望大家都能碰上好老师吧。
这是第一篇发表的博客吧,大多也来自于自己日常的了解与整理,希望对于更多想要了解Python中迭代器的同学有所帮助,如果觉得不戳,也希望得到大家的肯定与支持。当然,犯错了也希望得到大家的纠正,共同进步嘛。(老师不好就靠网上的大佬!)
首先,什么是迭代器?
是访问集合元素的一种方式。
是一个可以记住遍历的位置的对象。
迭代器对象从集合的首个元素开始一一访问,直到所有的元素被访问完结束。像极了象棋中的‘兵’,只能往前不会后退。
当然,不只是集合啦,列表,字符串,元组还有字典对象都可用于创建迭代器。
如下图:
- d = {
- 'w' : '表',
- 'h' : '演',
- '队' :'才',
- '长' :'艺'
- }
- lt = iter(d)
-
- print (next(lt))
- print (next(lt))
- print (next(lt))
- print (next(lt))
(上图用字典对象来创建迭代器输出结果竟然只有键!且不是乱序!)
- d = {
- 'w' : '表',
- 'h' : '演',
- '队' :'才',
- '长' :'艺'
- }
- for i in d.values():
- lt = iter(i)
- print (next(lt))
(上图用value和循环来弄可以弄出值来,但是感觉有点小麻烦)
至于能不能弄出键-值对,怎么弄出来,我只能说:I’m so vegetable!(手动一个滑稽)
过会再想想吧,弄出来会补充的,当然欢迎大佬教学,评论区见!
当然,‘lt’是可以用循环遍历的。(上面那个字典的值那里也用了,但是感觉效果不太好。)
不过如果是字典的话应该是无序的吧,原因这里就不详述了(懒了,哈哈哈)
好了,如果你也是个新手小白,看完上面几张图一定会感到疑惑,iter()和next()是什么?怎么用?
这么说吧,要把对象/类创建为迭代器,必须为对象实现 __iter__() 。
如果你学过面向对象你就会知道,所有类都需要一个__init__() 的函数,它使您在创建对象时进行一些初始化。
__iter__() 方法的作用与__init__()相似,您可以执行操作(初始化等),但必须始终返回迭代器对象本身。
__next__() 方法也允许您执行操作,并且必须返回序列中的下一个项目,差不多就是用来遍历的,可以理解为手动的for循环吧,一个一个地输出。
来来来,划重点,__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法。
简单说,先def __iter__(),再def__next__()。
下图是网上比较经典的例子(意思就是这代码基本上是我ctrl+c和ctrl+v的,当然要修改一点点的啦):
- class MyNumbers:
- def __iter__(self):
- self.a = 1
- return self
-
- def __next__(self):
- x = self.a
- self.a += 1
- return x
-
- myclass = MyNumbers()
- myiter = iter(myclass)
-
- print(next(myiter))
- print(next(myiter))
- print(next(myiter))
输出结果(自己换行哈,这里为了好看就不严谨一波了):1,2,3
有一个问题哈:
如果我们的__next__()方法过多或者我们再for循环中使用,可能造成无限循环的情况出现,怎么办呢?
在 __next__() 方法中,如果迭代完成了一定的次数,我们可以主动抛出一个异常来引发错误,从而终止循环。而这个异常,叫做StopIteration。
而主动抛出异常,需要使用raise。
简言之,作用与break相似。
下图又是一个经典样例(是的,我懒病又犯了,所以又从网上“整理”了一份代码,哈哈哈):
- class MyNumbers:
- def __iter__(self):
- self.a = 1
- return self
-
- def __next__(self):
- if self.a <= 13:
- x = self.a
- self.a += 1
- return x
- else:
- raise StopIteration
-
- myclass = MyNumbers()
- myiter = iter(myclass)
-
- for x in myiter:
- print(x)
当通过迭代器输出的数超过13,就会因为触发StopIteration异常而停止继续运行。
最后进行一下对于python中迭代器的总结吧。
可以被next()调用,不断返回下一个值的对象称为迭代器
使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。使用迭代器不仅节省内存空间,也可以显著提升代码运行速度。
迭代器通过方法__iter__()进行创建,可以用for循环与方法__next__()进行遍历
本文构成:网上到处借鉴+自我整理与理解,相当于自己的一份公开笔记吧
小白发文,多有缺陷,望指点与建议,会一直努力上进的。
若对你有帮助,十分高兴,也希望得到你的支持(懂的都懂,对吧?)。
生成器之后也肯定会写的,找时间吧。
Python3 迭代器与生成器 | 菜鸟教程 (runoob.com)
挺好的网站,挺适合像我这样的新手用来自学的,本文中部分资料来自于此。