2.3.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() メソッドを提供するイテレータオブジェクト (技術的にはジェネレータ オブジェクト) を自動的に返します。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。