プログラミングの入門でよく出てくる「FizzBuzz問題」を、Pythonで書いてみました。
結論から言うと、3で割り切れるか、5で割り切れるか、両方か、を if で分けるだけ です。この記事では、私が最初に書いた書き方と、もう少しすっきりした書き方、1行で書く方法の3つを紹介します。
要点
- FizzBuzzは、3の倍数で「Fizz」、5の倍数で「Buzz」、両方の倍数で「FizzBuzz」と言うゲームです
- 割り切れるかどうかは、あまりを出す
%が0かどうかで判断します - 「両方の倍数」を先に判断するのがポイントです
- 3つの書き方は、どれも同じ結果になります
FizzBuzzとは
もともとは、数人で遊ぶシンプルなゲームです。1から順番に数を言っていき、3で割り切れる数のときは「Fizz」、5で割り切れる数のときは「Buzz」と言います。3でも5でも割り切れるときは「FizzBuzz」です。
このゲームをプログラムで書くのが「FizzBuzz問題」です。プログラムが書けるかどうかを見るために、IT企業の入社試験などにも使われています。
書き方1:ifを重ねる(最初に書いたもの)
何も考えずに書いてみたのがこれです。人によって書き方はいろいろですが、だいたいこんな感じになると思います。
for i in range(1, 101):
if i % 3 == 0:
if i % 5 == 0:
print('FizzBuzz')
else:
print('Fizz')
elif i % 5 == 0:
print('Buzz')
else:
print(i)
言葉で流れを書くと
- for文で、1から100までくり返します
- 3で割り切れるかを判断します。割り切れたら、さらに5で割り切れるかを判断し、割り切れれば「FizzBuzz」、割り切れなければ「Fizz」を出します
- 3で割り切れなければ、5で割り切れるかを判断します。割り切れれば「Buzz」、割り切れなければ数字をそのまま出します
書き方2:15で割り切れるかを先に見る
3でも5でも割り切れる数は、15で割り切れる数です。これを一番先に判断すると、ifを重ねなくてよくなり、読みやすくなります。
for i in range(1, 101):
if i % 15 == 0:
print('FizzBuzz')
elif i % 3 == 0:
print('Fizz')
elif i % 5 == 0:
print('Buzz')
else:
print(i)
順番が大事で、i % 3 == 0 を先に書くと、15のときも「Fizz」になってしまいます。
書き方3:1行で書く
世の中には、これを1行で書いてしまう人もいます。私も書いてみました。
print('\n'.join('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or str(i) for i in range(1, 101)))
'Fizz' * (i % 3 == 0) は、3で割り切れるときだけ「Fizz」、割り切れないときは空の文字になります。Buzzも同じで、2つをつなげて空なら(or)数字を出す、という仕組みです。短くて面白いですが、読みやすさでは書き方2の方が上だと思います。
出力結果
3つとも、同じ結果になりました。最初の15個はこうなります。
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
この後も、100まで同じルールで続きます。
まとめ
- FizzBuzzは、3の倍数でFizz、5の倍数でBuzz、両方の倍数でFizzBuzzです
- 割り切れるかどうかは、
%(あまり)が0かどうかで判断します - 15で割り切れるかを一番先に判断すると、すっきり書けます
- 1行でも書けますが、読みやすさも大事です
もう少し歯ごたえのある練習問題がほしい方は、カプレカ数をPythonで求める記事もどうぞ。

独学プログラマー Python言語の基本から仕事のやり方まで