Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのイテレータ関数とは?基本の仕組みとカスタムイテレータの作り方を解説

Pythonにおけるイテレータ(Iterator)とは、反復処理プロトコル(イテレーションプロトコル)を実装したオブジェクトのことです。リスト、タプル、セットなどの標準的なデータ構造は、あらかじめイテレータとして動作するように作られているため、組み込みイテレータと呼ばれます。

イテレータを自作する場合、反復処理プロトコルに含まれる2つの特別なメソッドを実装する必要があります。それぞれの役割を詳しく見ていきましょう。

反復処理プロトコルを構成する2つのメソッド

1. __iter__() メソッド

__iter__() は、イテレータオブジェクトを初期化するときに呼び出されるメソッドです。このメソッドは、next()(Python 3では __next__())メソッドを持つオブジェクト、つまり自分自身を返す必要があります。

2. next() / __next__() メソッド

next()(Python 3では __next__())は、反復処理のシーケンスから次の要素を返すメソッドです。forループでイテレータを使用する場合、forループは内部で自動的にこの next() を呼び出し、要素を順番に取り出していきます。取り出す要素がなくなると StopIteration 例外が発生し、反復処理が終了します。

サンプルコード:2のべき乗を返すカスタムイテレータ

ここでは、指定された最大値まで2のべき乗(1, 2, 4, 8, 16...)を順番に返すカスタムイテレータを作成してみます。

# カスタムイテレータの作成
class Pow_of_Two:
    def __init__(self, max=0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration("Message")

a = Pow_of_Two(4)
i = iter(a)

print(i.__next__())
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))

実行結果

1
2
4
8
16
StopIteration エラーが発生

コードの解説

この例では、Pow_of_Two(4) として最大指数を4に設定しています。iter(a) を呼び出すと __iter__() メソッドが実行され、カウンタ n が0で初期化されます。

その後、next() を呼び出すたびに 2 ** n の計算結果が返され、以下のように値が出力されます。

  • 1回目:1(2の0乗)
  • 2回目:2(2の1乗)
  • 3回目:4(2の2乗)
  • 4回目:8(2の3乗)
  • 5回目:16(2の4乗)

6回目の呼び出し時点では n が最大値4を超えているため、条件分岐のelse側が実行され、StopIteration 例外が送出されます。これにより「これ以上取り出す要素がない」ことをPythonに伝え、反復処理が適切に終了します。

まとめ

イテレータは、__iter__()__next__() の2つのメソッドを実装することで自作できます。この仕組みを理解すると、forループや next() 関数がどのように動作しているのかが明確になり、ジェネレータや遅延評価など、より高度なPythonの機能への理解も深まります。独自のデータ構造に対して反復処理を実装したい場合に、ぜひ活用してみてください。

  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print