__iter__() 和 __next__()

要实现一个可迭代对象,比如一个类想被用于 for ... in 循环,类似 listtuple 那样,就必须实现一个 __iter__() 方法,该方法返回一个迭代对象,然后,Python 的 for 循环就会不断调用该迭代对象的 __next__() 方法拿到循环的下一个值,直到遇到 StopIteration 错误时退出循环。

我们以斐波那契数列为例,写一个 Fib 类,可以作用于 for 循环:

class Fib(object):
    
    def __init__(self, max_value):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b
        self.max_value = max_value # 初始化最大值
        
    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

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

我们用一个实例测试一下:

>>> fib = Fib(100)
>>> for i in fib:
    print(i)

1
1
2
3
5
8
13
21
34
55
89

你可能感兴趣的:(__iter__() 和 __next__())