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