python 迭代器 学习笔记

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

for i in 'Fishc': 

    print(i)

F

i

s

h

c

注意 迭代器迭代对象变成字典时,只迭代字典里的key值


python 迭代器 学习笔记_第1张图片

迭代器的两个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 迭代器 学习笔记_第2张图片

当然理是这理,实际运用时大家还是直接for 循环一句搞定啦,毕竟python追求的是至简,嘻嘻



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

F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)

代码如下:


python 迭代器 学习笔记_第3张图片

但要注意一下第8行代码的写法, self.a,self.b = self.b,self.a+self.b,一行里同时对对两个变量赋值没有问题,那我们分开两个赋值,就像这样:


python 迭代器 学习笔记_第4张图片

为啥运行结果完全不一样了呢,按我们来分析下,首先 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 迭代器 学习笔记_第5张图片

总结:

for 循环会自动调用iter()函数将可迭代对象变成迭代器对象,相当于自动调用当前对象所对应的__iter__方法,然后一直调用next()函数,相当于自动调用当前对象所对应的__next__方法.

全程手码,虽然是些基础知识,但为了自己加深印象,就在记录下,若有需要指点的尽管批评,哈哈 菜鸟不易

多敲代码才是真理



你可能感兴趣的:(python 迭代器 学习笔记)