generated at
Python:ジェネレータ関数
yield 文は、ジェネレータ関数を定義するときだけ使われる。また、yieldを使うだけで、関数はジェネレータ関数になる。
ジェネレータ関数が呼び出されると、ジェネレータを返す。
ジェネレータの next() が例外を発行するまで繰り返し呼び出して実行する。
yield 文が実行されると、ジェネレータの状態は凍結(全てのローカルな状態が保存)され、次に next() が呼び出された際に利用できる。

関数の中に yield があったら、そこで一時停止して値が返される。
再開するには呼出側で next() を呼出す。
for は内部でジェネレータの next() を呼出してくれる。
呼出し側からジェネレータに値を渡したい場合、send() を使う。
>def gen_seq(s, e):
> x = s
> while True:
> yield x
> x += 1
> if x > e:
> raise StopIteration
>
>for i in gen_seq(2, 5):
> print i

結果
>2
>3
>4
>5


>def fibonacci():
> a,b = 0,1
> while True:
> yield b
> a,b = b, a+b
>
>fib = fibonacci()
>next(fib)
>1
>next(fib)
>1
>next(fib)
>2