#
5 イテレータ型

バージョン 2.2 で 新たに追加 された仕様です。

Python はコンテナの内容にわたって反復処理を行う概念をサポートして います。この概念は 2 つの別々のメソッドを使って実装されています; これらのメソッドはユーザ定義のクラスで反復を行えるようにするために 使われます。後に詳しく述べるシーケンス型はすべて反復処理メソッドを サポートしています。

以下はコンテナオブジェクトに反復処理をサポートさせるために定義しなければ ならないメソッドです:

`__iter__`( | )

  イテレータオブジェクトを返します。イテレータオブジェクトは以下で述べる イテレータプロトコルをサポートする必要があります。あるコンテナが 異なる形式の反復処理をサポートする場合、それらの反復処理形式 のイテレータを特定的に要求するようなメソッドを追加することができます (複数の形式での反復処理をサポートするようなオブジェクトとして 木構造の例があります。木構造は幅優先走査と深さ優先走査の両方を サポートします)。 このメソッドは Python/C API において Python オブジェクトを表す 型構造体の `tp_iter` スロットに対応します。

イテレータオブジェクト自体は以下の 2 のメソッドをサポートする必要 があります。これらのメソッドは 2 つ合わせて イテレータプロトコル を成します:

`__iter__`( | )

  イテレータオブジェクト自体を返します。このメソッドはコンテナとイテレータの 両方を`for` および `in` 文で使えるようにするために 必要です。このメソッドは Python/C API において Python オブジェクトを表す 型構造体の `tp_iter` スロットに対応します。

`next`( | )

  コンテナ内の次の要素を返します。もう要素が残っていない場合、 例外 `StopIteration` を送出します。このメソッドは Python/C API において Python オブジェクトを表す型構造体の `tp_iternext` スロットに対応します。

Python では、いくつかのイテレータオブジェクトを定義しています。これらは 一般的および特殊化されたシーケンス型、辞書型、そして他のさらに特殊化 された形式をサポートします。特殊型であることはイテレータプロトコル の実装が特殊になること以外は重要なことではありません。

このプロトコルの趣旨は、 一度イテレータの `next()` メソッドが `StopIteration` 例外を送出した場合、以降の呼び出しでもずっと例外を送出しつづける ところにあります。この特性に従わないような実装は変則であると みなされます (この制限は Python 2.3 で追加されました; Python 2.2 では、この規則に従うと多くのイテレータが変則となります)。

Python におけるジェネレータ (generator) は、イテレータプロトコル を実装する簡便な方法を提供します。コンテナオブジェクトの `__iter__()` メソッドがジェネレータとして実装されて いれば、メソッドは `__iter__()` および `next()` メソッドを提供するイテレータオブジェクト (技術的にはジェネレータ オブジェクト) を自動的に返します。