なんか最近こればかりしていますが、言語とTDDとアルゴリズムの勉強という一石三鳥を狙った勉強法なので結局毎日こればかりしている形になっています。
今日はPython&py.testでフィボナッチ数列。
なんでフィボナッチ数列かというと、Pyhtonでジェネレータを使ってみたかったからです。
さて、早速コードを見てみます。例によってFizzBuzzより相当短いですが。言い忘れてましたが、今使っているPyhtonのバージョンは2.6です。
def fibonacci(): x, y = 1, 1 while True: yield x x, y = y, x+y
fibonacci.py
from fibonacci import * class TestFibonacci: def test_fibonacci(self): fib = fibonacci() assert next(fib) == 1 assert next(fib) == 1 assert next(fib) == 2 assert next(fib) == 3 assert next(fib) == 5 assert next(fib) == 8
testFibonacci.py
コードとしてはそんなに難しいことをしているわけではないのですが、yieldというコルーチンの処理が入っています。テストコード側でnext(fib)を実行するたびにyieldの後ろの変数xの値が戻り、次の処理に入ってまたyieldで止まるという形になっています。止まるだけなので関数内のデータは保持されたままなので次にnext(fib)を実行するとちゃんと次の数列の値が戻ります。
もう少しだけ、他の簡単なアルゴリズムの実装をやってから、入出力などの例外処理などを行わなければならないコードに入っていきたいと思います。