python|python 迭代器 学习笔记

迭代器:首先要明确的概念是迭代器不是容器迭代器就是为了实现__next__()方法的对象(用于遍历容器中的数据)

for i in 'Fishc':
print(i)
F
i
s
h
c
注意 迭代器迭代对象变成字典时,只迭代字典里的key值


python|python 迭代器 学习笔记
文章图片
迭代器的两个BIF:
. iter()函数用来生成迭代器(会调用到__iter__()方法),以此迭代器里拥有__next__()方法,再用next()函数就睡自动调用到迭代器里的__next__()方法
. next()
迭代器的两个两个魔法方法:
. __iter__()返回迭代器自身可以返回另一个可迭代对象
. __next__() 遍历容器中的每个元素
敲黑板啦!
__iter__()不光可以 返回迭代器自身(self),__iter__方法也可以返回另一个可迭代对象

class IterTest:

def __iter__(self):
return iter([1,2,3])
for iin IterTest():
print(i)
1
2
3


我们迭代容器中元素会很自然的想到for 循环那如果不用for 循环呢,那就自然需要用到迭代器的那两个BIF啦
string = 'FishC'
it = iter(string)
next(it)
'F'
next(it)
'i'
next(it)
's'
next(it)
'h'
next(it)
'C'
next(it)
StopIteration
string通过 iter()变成迭代器以后,迭代器自身是拥有__next__()方法的,而next()这个BIF会自动调用到__next__()方法,从而遍历容器中的元素,而对于自定义的迭代器 如果没写__iter__()方法的我们是不能用for循环的,但是可以直接用next()方法,因为for循环会调用iter()方法自然要调用到__iter__()方法 而如果自定义迭代器没有这个方法就自然用到for循环
class Fibs:
def __init__(self,n):
self.a = 0
self.b = 1
self.n = n
def __next__(self):
self.a,self.b = self.b,self.a+self.b
if self.a return self.a
raise StopIteration
fibs = Fibs(20)
print(next(fibs))
1
那问题来了 既然可以用到这两个BIF就能实现for循环的功能,但是要手动next(),那我们将这两个BIF搭配while语句就能够完全实现for循环了,代码如下:
python|python 迭代器 学习笔记
文章图片
当然理是这理,实际运用时大家还是直接for 循环一句搞定啦,毕竟python追求的是至简,嘻嘻


基本内容就这些啦,也该出点干货了,那就那斐波那契数列来创建一个迭代器的类吧,首先斐波那契名字高大上,但我们只需要知道它是一个数列就行了,就像等差 ,等比数列一样 ,那斐波那契啥也不等 ,它的通项公式
F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)
代码如下:


python|python 迭代器 学习笔记
文章图片
但要注意一下第8行代码的写法, self.a,self.b = self.b,self.a+self.b,一行里同时对对两个变量赋值没有问题,那我们分开两个赋值,就像这样:


python|python 迭代器 学习笔记
文章图片
为啥运行结果完全不一样了呢,按我们来分析下,首先 self.a,self.b = self.b,self.a+self.b 是将右边的值赋值给左边的变量,那self.a被赋值成1,self.b被赋值成0+1这很合乎逻辑和常理对吧,那我换成
self.a = self.b

self.b = self.a+self.b
那self.a被赋值成1,那下面的self.b就是被1+1赋值了
所以这个小细节要注意一下哦
【python|python 迭代器 学习笔记】当然这段代码还可以再完善一下,譬如可以设定这个数列的长度,聪明的你知道咋弄了吗?算啦 废物 还是我来告诉你吧


python|python 迭代器 学习笔记
文章图片
总结:
for 循环会自动调用iter()函数将可迭代对象变成迭代器对象,相当于自动调用当前对象所对应的__iter__方法,然后一直调用next()函数,相当于自动调用当前对象所对应的__next__方法.
全程手码,虽然是些基础知识,但为了自己加深印象,就在记录下,若有需要指点的尽管批评,哈哈 菜鸟不易
多敲代码才是真理


    推荐阅读