CodeKata第一問 : FizzBuzz @Python3.4

今日からpythonの練習課題として、ひとつずつ問題を解き、同時にそのコードと解説をブログに綴ってみようと思います。。。

もっといい書き方がある!って思った方は教えてください(^_^;)

 

それでは始めてみましょう!

第一回目のお題は「FizzBuzz

 

問題


 1から順番に数を表示する。その数が3で割り切れるなら"Fizz"、5で割り切れるなら"Buzz"、両方で割り切れるなら"FizzBuzz"と表示する。要するに"1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz ・・・"と出力される。

プログラマかどうかがわかるんだとさ...(-_-;)

実行例 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34

 

 

考え方


つまり3の倍数の時は"Fizz"、5の倍数の時は"Buzz"、15の倍数の時は"FizzBuzz"と表示すればいいので、単純に数字をひとつずつif文で判断していけばいいかと思います。

 

 

コード



def fizzbuzz(num):
    ret = ""
    for i in range(1, num + 1):
        if i % 3 == 0:
            ret += "Fizz"
        if i % 5 == 0:
            ret += "Buzz"
        if (i % 3 != 0) and (i % 5 != 0):
            ret += str(i)
        ret += " "
    return ret


if __name__ == "__main__":
    print(fizzbuzz(50))

 

 

解説


今回は、1から引数に取った値までを判定する関数、fizzbuzzを作成しました。

この関数は、単純に1~引数までの値を順にif文で判断しているだけですので解説することはほぼありません...(^_^;)

強いて言えば、if文に少し工夫を加えたところぐらいでしょうか

つまり、本来ならば15と3と5とそれ以外を判断するには、下記のように条件式が4つ必要になります。


if (i % 3 == 0) and (i % 5 == 0):
    ret += "FizzBuzz"
elif i % 3 == 0:
    ret += "Fizz"
elif i % 5 == 0:
    ret += "Buzz"
else:
    ret += str(i)
ret += " "

しかし、今回は、下記のようにあえてelif,elseを用いずにifのみで条件式を3つで済ませました。


if i % 3 == 0:
    ret += "Fizz"
if i % 5 == 0:
    ret += "Buzz"
if (i % 3 != 0) and (i % 5 != 0):
    ret += str(i)
ret += " "

このように記述することで、iが15の倍数であった時は「if i % 3 == 0:」と「if i % 5 == 0:」の中身が両方実行され、”FizzBuzz "という文字列になります。

 

 

今回使用した要素



>>> 4 % 2    4を2で割った時のあまりを求めることができます
0

>>> a = 3
>>> a += 2    変数aに2を足すことができます
>>> a
5