如何让类也变成可以迭代的对象

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

这样Fib就是一个可迭代的对象 , 由于是对象需要对于 类 Fib先实例化

#for 循环本质
# l=Fib()
# iter_l=l.__iter__()
# while True:
# try:
# print(iter_l.__next__())
# except StopIteration:
# print('迭代完毕')
# break

总结: 

在类定义中如果有__iter__(),那么就是可迭代对象,如果有了__next__()就是迭代器 

for 循环的本质需要你既有__iter__(),也 需要你有__next__()

所以如果 没有__Iter__(),报错!

我这里变一下 

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    # def __iter__(self):
    #    return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

运行

s= Fib() # 实例本身就是可迭代器
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())

结果

1
1
2
3
5
8
13

 

posted on 2020-06-14 08:02  jvincent  阅读(386)  评论(0编辑  收藏  举报