鱼C论坛

 找回密码
 立即注册
查看: 876|回复: 4

魔法函数实现迭代器

[复制链接]
发表于 2020-4-1 16:37:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Fibs:
       def __init__(self, n=20):
             self.a = 0
             self.b = 1
       def __iter__(self):
             return self 
       def __next__(self):
             self.a, self.b = self.b, self.a + self.b
             return self.a
__next__中的语句是什么意思了?这个next内部具体是如何运行的,

fibs = Fibs()
for each in fibs:
               print(each)
为什么print能够自动打印出所有的元素了,内部__next__做了设么操作


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 16:39:50 | 显示全部楼层
本帖最后由 十月故里 于 2020-4-1 16:43 编辑

首先第二个你用for语句对这个迭代器进行了遍历,自然就把所有元素都打印了一边
你可以用 next(fibs)来测试一下next的功能,就是自动到fibs的下一个元素
注意next到没有元素的时候会返回一个StopIteration
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 16:41:02 | 显示全部楼层
差不多是酱紫的:
>>> # 假设这里有一个myGen
>>> a = myGen(50)
>>> next(a) # __next__ 就是执行这样的操作
1
>>> next(a)
2
>>> # 直接遍历
>>> for i in a:
        print(i, end = " ")

        
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 17:10:28 | 显示全部楼层
__iter__()和__next__()都是重载了python原有的同名函数。
__iter__()是迭代器函数,
__next__()就是返回迭代的下一个元素。
你写的__next__()函数中少了终止条件,程序会无限循环下去
帮你修改了一下。
同时帮你添加了一下next 的用法
class Fibs:
        def __init__(self, n=20):
                self.a = 0
                self.b = 1
                self.n=n
        def __iter__(self):
                return self
        def __next__(self):
                if self.n==0:
                        raise StopIteration
                self.n-=1
                self.a, self.b = self.b, self.a + self.b
                return self.a
fibs = Fibs()
for each in fibs:
        print(each)
fib2 = Fibs(10)
for i in range(10):
        print(next(fib2))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 17:25:39 | 显示全部楼层
对 fibs 进行一次迭代就是获取 fibs.__next__() 的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表