1. ホーム
  2. python

[解決済み] 基本的なイテレータを作るには?

2022-03-15 06:39:26

質問

Python で反復関数 (またはイテレータオブジェクト) を作成するにはどうしたらよいでしょうか?

どのように解決するのですか?

Python のイテレータオブジェクトはイテレータプロトコルに準拠しており、基本的に2つのメソッドを提供します。 __iter__()__next__() .

  • __iter__ はイテレータオブジェクトを返し、暗黙のうちに呼び出されます。 をループの先頭で使用します。

  • __next__() メソッドは次の値を返し、ループの増分ごとに暗黙のうちに呼び出されます。 このメソッドは、返すべき値がなくなると StopIteration 例外を発生させ、ループ構成によって暗黙のうちに捕捉されて反復が停止されます。

カウンターの簡単な例です。

class Counter:
    def __init__(self, low, high):
        self.current = low - 1
        self.high = high

    def __iter__(self):
        return self

    def __next__(self): # Python 2: def next(self)
        self.current += 1
        if self.current < self.high:
            return self.current
        raise StopIteration


for c in Counter(3, 9):
    print(c)

これで印刷されます。

3
4
5
6
7
8

これは、以前の回答で取り上げたように、ジェネレータを使って書くと簡単です。

def counter(low, high):
    current = low
    while current < high:
        yield current
        current += 1

for c in counter(3, 9):
    print(c)

印刷出力は同じになります。 裏を返せば、ジェネレータオブジェクトはイテレータプロトコルをサポートし、クラスCounterと大体似たようなことをやっているのです。

David Mertzの記事。 イテレータとシンプルなジェネレータ は、かなり良い入門書です。