Fizz Buzz

というわけで、考え方の具体例を書いてみました。お題はみんな大好き FizzBuzz です。

Fizz Buzz (WikiPedia)


このままじゃアレだし名前空間汚しまくりなので、ここから もうちょっとわかりやすくクラス化して、書きやすく、テストしやすく メガ進化させる必要がありますが、 最終的にやることはこんな感じかなあと。

# -*- coding: utf8 -*-
from __future__ import print_function
"""
関数 fizzbuzz   引数 :x
 xが3と5の公倍数=15の倍数なら fizzbuzz
 xが3の倍数なら fizz
 xが5の倍数なら buzz
 それ以外はxをそのまま返す
"""
Fizz="Fizz"
Buzz="Buzz"
FizzBuzz="FizzBuzz"

condlist=[
  #(条件判定する関数 ,  実行する内容)

    # xが3と5の公倍数=15の倍数なら fizzbuzz
    ((lambda x:x%15==0), (lambda x:FizzBuzz)),

    # xが3の倍数なら fizz
    ((lambda x:x%5==0), (lambda x:Buzz)),

    #xが5の倍数なら buzz
    ((lambda x:x%3==0), (lambda x:Fizz)),

    # それ以外はxをそのまま返す
    ((lambda x:True),   (lambda x:x))
]


def fizzbuzz(x):
    for c,f in condlist:
        #条件が成立したら
        if c(x):  
           # 処理を実行、それ以降は実行せずして返る
            return f(x)  
    else :
        #どの条件にもあてはまらなかった場合
        raise Exception #今回 ここは実行されないはず

#答えあわせ用
testcase=[FizzBuzz,1,2, Fizz, 4, Buzz,
      Fizz, 7, 8, Fizz, Buzz,
          11, Fizz, 13, 14, FizzBuzz, 
     16, 17, Fizz, 19, Buzz,
          Fizz, 22, 23, Fizz, Buzz,
      26, Fizz, 28, 29, FizzBuzz 
]

#1から30までやってみる

for i in xrange(1,30+1):
    ret=fizzbuzz(i)
    assert ret==testcase[i]  #答えあわせ
    print(i,ret)