Fizz Buzz
というわけで、考え方の具体例を書いてみました。お題はみんな大好き FizzBuzz です。
このままじゃアレだし名前空間汚しまくりなので、ここから もうちょっとわかりやすくクラス化して、書きやすく、テストしやすく メガ進化させる必要がありますが、 最終的にやることはこんな感じかなあと。
# -*- 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)