guoquanli 发表于 2020-4-1 16:37:20

魔法函数实现迭代器

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__做了设么操作


十月故里 发表于 2020-4-1 16:39:50

本帖最后由 十月故里 于 2020-4-1 16:43 编辑

首先第二个你用for语句对这个迭代器进行了遍历,自然就把所有元素都打印了一边
你可以用 next(fibs)来测试一下next的功能,就是自动到fibs的下一个元素
注意next到没有元素的时候会返回一个StopIteration

qiuyouzhi 发表于 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

sunrise085 发表于 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))

zltzlt 发表于 2020-4-1 17:25:39

对 fibs 进行一次迭代就是获取 fibs.__next__() 的返回值。
页: [1]
查看完整版本: 魔法函数实现迭代器