2013 1月26日 14:33
@souda1025 に PythonでFizzBuzzとかしてみた に対抗しろって煽られたので。
@soudai1025 が書いたブログ記事にPythonでFizzBuzzとかしてみたというエントリーがあるのですが、Facebookでこういうコメントをみた。 多分、ひむひむが対抗してくるはず。 全力でお答えしましょう。 とりあえず、普通 FizzBuzz かくならこうかくだろう。 def fizzbuzz(number): if number % 15 == 0: # number % 5 == 0 and number % 3 == 0 return "FizzBuzz" elif number % 5 == 0: return "Buzz" elif number % 3 == 0: return "Fizz" else: return str(number) if __name__ == '__main__': number = int(raw_input("Please enter an integer: ")) print fizzbuzz(number) 数値を入れると 数値の文字列 か “Fizz” か “Buzz” か “FizzBuzz” を返す関数を用意するほうが柔軟性があり、わかりやすいです。 さて、もとのコードを確認していきましょう。 int = int(raw_input("Please enter an integer: ")) def do_fizz(int): if (int % 3) == 0: return 1 return 0 def do_buzz(int): if (int % 5) == 0: return 2 return 0 def do_answer(fizz, buzz): flag = fizz + buzz if flag == 0: print int #引数に居なくても外のintを参照出来る elif flag == 1: print "Fizz" elif flag == 2: print "Buzz" elif flag == 3: print "FizzBuzz" do_answer(do_fizz(int), do_buzz(int)) さて、気になる点をあげていこう。 do_answer 関数が外のスコープにアクセスしている。 よくわからないフラグ処理がされている。 do_answer の引数が意味不明。 関数が外のスコープにアクセスしている 関数が外のスコープにアクセスしてしまうとその関数だけみたときに他の部分を確認しないといけないのでよくない。 それぐらいなら引数を追加しましょう。 よくわからないフラグ処理がされている do_fizz と do_buzz が関数名から何をするのかさっぱりわからない。 do_fizz は 3で割り切れる場合 1 を返し、それ以外の場合は 0 を返す関数である do_buzz は 5で割り切れる場合 2 を返し、それ以外の場合は 0 を返す関数である ということはコードをよまなければわからない。ならば、関数の頭にコメントをかくか、そのような名前の関数にすべきだと思う。 do_ という接頭辞が着いている以上何かする関数だと想像するので、ここで print されているのであれば、まだ良いと思うけど, iPhoneで閲覧していたらこの命名のせいで混乱しました。 do_answer の引数が意味不明 fizz って何?