python 迭代器 学习笔记

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

for i in 'Fishc': 

    print(i)

F

i

s

h

c

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


迭代器的两个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 <self.n:

            return self.a

        raise StopIteration

fibs = Fibs(20)

print(next(fibs))

1

那问题来了 既然可以用到这两个BIF就能实现for循环的功能,但是要手动next(),那我们将这两个BIF搭配while语句就能够完全实现for循环了,代码如下:

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



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

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

代码如下:


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


为啥运行结果完全不一样了呢,按我们来分析下,首先 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赋值了

所以这个小细节要注意一下哦

当然这段代码还可以再完善一下,譬如可以设定这个数列的长度,聪明的你知道咋弄了吗?算啦 废物 还是我来告诉你吧


总结:

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

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

多敲代码才是真理



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,935评论 0 8
  • 好感动,刚刚回原来的地方拿放在抽屉的书。因为上个月查学生证没有地方去,跑到西一的教室,坐的那个位子其实边上有一个男...
    一块瘦司阅读 185评论 0 0
  • 好冷啊! 我坐在摩托车上,风,穿过我爸的肩膀,铺面打来。我尽量缩起身子,想躲在爸爸背后,可怎么躲也躲不过风,索性,...
    东亭阅读 240评论 0 0
  • Python3爬虫工具-仅用3条命令创建你的爬虫! 1.前言 Mini-Spider是一个实用的爬虫工具,它的意义...
    ZhangYunHao阅读 2,625评论 0 24
  • 手机几乎快没电的时候,耗费心思的写了一首诗,抓住一瞬间的灵感,宣泄完以后就像一个被戳破的气球,瘪下去,然后失眠。 ...
    屏鸟阅读 142评论 1 2