趣味のPython・深層学習

中級者のための実装集

__iter__, __next__によるイテレータの実装

1. iter メソッドの役割

iter メソッドはクラスがイテレータとして振る舞うための特殊メソッドです。このメソッドを実装することで、クラスのオブジェクトを iter() 関数で呼び出せるようになります。

class MyIterator:
    def __iter__(self):
        return self

iter メソッドでは、通常 self を返し、これによりオブジェクト自体がイテレータであることが示されます。これによって for ループなどでオブジェクトを直接イテレートできるようになります。

2. next メソッドの役割

next メソッドはイテレータが次の要素を返すための特殊メソッドです。このメソッドを実装することで、next() 関数や for ループでイテレーションが進められます。

class MyIterator:
    def __next__(self):
        # 次の要素があれば返す
        # なければ StopIteration を発生させる
        if ...:
            return ...
        else:
            raise StopIteration

next メソッド内で次の要素があればその値を返し、なければ StopIteration を発生させることでイテレーションを終了させます。

3. イテレータの実装例

class CountdownIterator:
    def __init__(self, start: int) -> None:
        self.start: int = start

    def __iter__(self) -> 'CountdownIterator':
        return self

    def __next__(self) -> int:
        if self.start > 0:
            result: int = self.start
            self.start -= 1
            return result
        else:
            raise StopIteration

# CountdownIteratorのインスタンスを作成
countdown_iterator: CountdownIterator = CountdownIterator(5)

# イテレーションを通じて値を取得
for number in countdown_iterator:
    print(number)

この例では、CountdownIterator クラスが iternext メソッドを実装しています。これにより、オブジェクトがイテレータとして機能し、for ループなどで使用できるようになります。