バリケンのPython日記 RSSフィード

2008-12-09

[] イテレータとジェネレータ(3)  イテレータとジェネレータ(3) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  イテレータとジェネレータ(3) - バリケンのPython日記  イテレータとジェネレータ(3) - バリケンのPython日記 のブックマークコメント

この間の続きだよ。

じゃあ、「イテレータ」と「ジェネレータ」に対する実験結果から、「イテレータとは何か」「ジェネレータとは何か」についてまとめてみるね。

イテレータとは

まずはイテレータだよ。

イテレータがなぜうれしいかと言うと、たとえば構造を持ったオブジェクトの大きさを知らなくても、StopIteration例外が発生するまでnext()メソッドを呼ぶことで全ての要素を参照することが出来たりするよ。

実はこれはPythonのfor文が内部的にやっていることだよ。

for x in 構造を持ったオブジェクト:
  処理

のように書くと、まず構造を持ったオブジェクト引数としてiter()関数を呼んでイテレータを生成し、それからStopIteration例外が発生するまでイテレータに対してnext()メソッドを呼んで、その戻り値をxに代入して処理を実行する、ということを繰り返すのがfor文のしくみだよ。

ジェネレータとは

次はジェネレータだよ。

  • ジェネレータとは、値の生成器である
  • イテレータとは異なり、必ずしも「構造を持ったオブジェクトの要素を繰り返し参照するもの」ではない
  • ジェネレータに対してnext()メソッドを呼ぶと、何らかの値が返ってくる
  • 次に返すべき要素がないジェネレータに対してnext()メソッドを呼ぶとStopIteration例外を発生するが、イテレータと異なり必ず「最後の要素」があるわけではない(無限に要素を返すジェネレータもある)
  • ジェネレータの作り方は、ジェネレータ式を使う方法とyield文を使う方法とがある

ジェネレータ式についてはこの間のエントリで軽く触れたけど、次回はyield文を使ったジェネレータの生成方法について勉強してみるよ。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20081209