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

参考