__iter__()と_next__()

947 ワード

クラスがfor ... inサイクルに使用されるように反復可能なオブジェクトを実装するには、listまたはtupleのように、__iter__()メソッドを実装する必要があります.このメソッドは反復オブジェクトを返し、Pythonのforサイクルは反復オブジェクトの__next__()メソッドを呼び出してサイクルの次の値を取得します.StopIterationエラーが発生するまでループを終了します.
フィボナッチ数列を例にとると、forサイクルに作用するFibクラスを書きます.
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