Pythonのyieldを使ってフィボナッチ数列を表現してみるメモ

Pythonでは関数定義の中にyield文があると、その関数はジェレネレータ関数となる(らしい)。

フィボナッチ数列を10項表示してみるとこんな感じ。


$ python
>>> def fib():
... x, y = 0, 1
... while True:
... yield x
... x, y = y, x + y
...
>>> z = fib()
>>> for i in range(10):
... print z.next()
...
0
1
1
2
3
5
8
13
21
34
>>>
ジェネレータ関数fib()のnextメソッド(ジェネレータ関数では__init__メソッドとnextメソッドが自動で定義される)が呼び出されるとyield文までが実行されて、yieldで指定されているxの値が戻り値として返される。
以降、nextメソッドが呼び出されると、yieldの直後の文から処理を再開し、次のyield文までが実行されて、yieldで指定されているxの値が戻り値として返される......という処理を繰り返す(らしい)。
フィボナッチ数列のような無限回の繰り返し処理を表現するのに都合が良いみたい。