WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

PythonでFizzBuzzワンライナー

Pythonのリスト内包表記に慣れることを目的にFizzBuzz問題をやってみました。


そもそもFizzBuzzってなんだよ

– 2人以上のプレイヤーが1から順番に数字を発言していく
– 3で割り切れるときは「Fizz」を発言
– 5で割り切れるときは「Buzz」を発言
– 両方で割り切れるときは「FizzBuzz」を発言
– 間違えた人から脱落
細かな違いはあるでしょうが大体上記のようなルールのゲームです。

初心者も上級者も。FizzBuzz問題について考えてみよう | SiTest (サイテスト) ブログより引用。


昔流行った「世界のナベアツ」のギャグに似ていますね。
今回は1~100でやってみました。


まずは普通にfor文で書いたものから。

for num in range(1, 101):
        if num % 15 == 0:
                print "FizzBuzz"
        elif num % 3 == 0:
                print "Fizz"
        elif num % 5 == 0:
                print "Buzz"
        else:
                print num


続いてwhile文。

num = 1
while num <= 100:
        if num % 15 == 0:
                print "FizzBuzz"
        elif num % 3 == 0:
                print "Fizz"
        elif num % 5 == 0:
                print "Buzz"
        else:
                print num
        num += 1


そしてここからが本題です。


三項演算子:条件分岐を1行で記述することができる。

(条件がTrueのときの値) if (条件) else (条件がFalseのときの値)


リスト内包表記:リストを生成するための表記方法。リストにおけるループ処理を1行で記述することができる。

[(式) for (変数) in (リストオブジェクト)]


これらを用いて記述していきます。


2行縛り(三項演算子

for num in range(1, 101):
     print "FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else num


続いて1行縛り(リスト内包表記+三項演算子

["FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else str(num) for num in range(1, 101)]


これではリストを作るだけで表示はされないので少し改良して、

print("\n".join(["FizzBuzz" if num % 15 == 0 else "Fizz" if num % 3 == 0 else "Buzz" if num % 5 == 0 else str(num) for num in range(1, 101)]))


リスト内包表記を用いることで、コードがシンプルになり、実行速度が高速になりました。