pythonで反復を使用

2397 ワード

反復器は、コレクション内の要素にアクセスする方法です.反復オブジェクトは、すべての要素が一度アクセスされるまで、コレクションの最初の要素からアクセスを開始します.
反復器はロールバックできず、前に反復するしかありません.これは大きな欠点ではありません.反復の途中でロールバック操作を行う必要がほとんどないからです.
元のランダムアクセスをサポートするデータ構造(tuple、listなど)では、反復器は古典的なforループのインデックスアクセスと比較して優位性がなく、インデックス値が失われます(組み込み関数enumerate()を使用してこのインデックス値を取り戻すことができます.これは後述します).ただし、setなどのランダムにアクセスできないデータ構造では、反復器は要素にアクセスする唯一の方法です.反復器のもう一つの利点は、反復中のすべての要素を事前に準備する必要がないことです.反復器は、ある要素に反復したときにのみその要素を計算しますが、その前または後に要素が存在しないか、破棄されます.この特徴は、いくつかのGのファイルやフィボナッチ数列など、いくつかの巨大または無限の集合を遍歴するのに特に適している.この特徴を,遅延計算または不活性評価(Lazy evaluation)と呼ぶ.
反復器のより大きな功績は,統合されたアクセスセットのインタフェースを提供することである.iter()メソッドを実装したオブジェクトであれば、反復器を使用してアクセスできます.
反復の使用
ビルドされたファクトリ関数iter(iterable)を使用して、反復オブジェクトを取得します.
> lst = range(3)
> it = iter(lst)
> it
<listiterator object at 0x0251BFD0>

反復器のnext()メソッドを使用して、次の要素にアクセスします.
it.next() 0 next(it) 1
両者の効果は同じです.
Pythonの反復器にはhasのようなものはありませんnext()のような方法では、反復器が最後にアクセスした場合、next()関数を再度使用すると異常StopIterationが発生します.異常をキャプチャすることで終了できます.
>it = iter(lst)
>try:
    while True:
        val = it.next()
        print val
>except StopIteration:
    pass

反復操作がこのように一般的であるため、Pythonはキーワードforを反復器の構文として専門に使用している.forループでは、Pythonは工場関数iter()取得反復器を自動的に呼び出し、next()取得要素を自動的に呼び出し、StopIteration異常をチェックする作業も完了します.上記のコードは、次のように書くことができます.
for val in lst:
    print val

まずPythonは、キーワードin後のオブジェクトに対してiter関数を呼び出して反復器を取得し、その後、StopIteration異常が放出されるまで反復器のnextメソッドを呼び出して要素を取得する.反復器に対してiter関数を呼び出すと反復器自体が返されるので、反復器はfor文にも使用でき、特別な処理は必要ありません.よく使用されるいくつかの組み込みデータ構造tuple、list、set、dictは反復器をサポートし、文字列は反復操作も使用できます.上記のように、クラスのiterメソッドにオブジェクトを返すだけで、next()メソッドを持つ反復器を自分で実現することもできます.このメソッドは、適切なときにStopIteration異常を投げ出すことができます.