Pythonのyieldとiter
from __future__ import generators def gen() for x in (1,2,3,4) yield x;
上記のようなgenという関数を定義して、
g = gen()
と呼び出すとgにはgenのiterが代入されて.next()出来る、という考えでいいのか。で、普通は内部イテレータとして扱う。内部イテレータっていうのは
for (obj) { ... }
のような感じでobjのメンバを列挙できるような機構。javascriptのメンバとか。perlの配列も?下記のように使うと、1,2,3,4と出力されるはず。for内部でgen()から取得したiterオブジェクトのnext()メソッドをgに代入しているイメージいいのかな。
for g in gen(): print g
外部イテレータっぽく使う場合はStopIterationのハンドリングが必要。外部イテレータというのはc言語のforみたいな昔ながらのカウンタ使った列挙方法。カウンタのような外部変数が必要なので「外部」。(ここ外部イテレータとは言わないかも。明示的にnext()使ってるから外部と書いてみましたが)
g = gen(); try: while 1: print g.next(), except StopIteration: pass
StopIterationには見覚えがあります。時期javascriptでyieldが導入されるとのことです。
function count(n : int) { for (let i = 0; i < n; i++) yield i } var gen = count(10) gen.next() returns 0; . . .; gen.next() returns 9 gen.next() throws StopIteration
参考