にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Pythonのジェネレータでフィボナッチ数列を出力

借り物のみんなのPython読んでる。
イテレータとジェネレータの解説読んでて、今までろくに使ったことなかったなと思い少しコードを書いてみた。
書籍ではサンプルコードとして素数を順々に出力するジェネレータ関数が書かれているので、それを参考にフィボナッチ数列を順番に出力する関数を書いてみた。

def get_fibo_gen():
    x,y,cnt = 1,1,0
    while True:
        if cnt == 0 or cnt == 1:
            yield 1
        else:
            x,y = y,x+y
            yield y
        cnt += 1

if __name__ == '__main__':
    i = get_fibo_gen()
    for cnt in range(20):
        print i.next(),
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

バカ正直に書いてみたけど、cntなんて変数、いらなくね?やり直し。

def get_fibo_gen():
    x,y = 1,1
    yield x
    yield y
    while True:
        x,y = y,x+y
        yield y

if __name__ == '__main__':
    i = get_fibo_gen()
    for cnt in range(20):
        print i.next(),
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

ちょっとすっきり。
だけど、これじゃ必ず初項からしか出力できないね。そこは呼び出す側で調整すればいいのか。

みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.10.30
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 71550