FizzBuzz
FizzBuzz とは
1 から n までを判定し、3 の倍数は Fizz、5 の倍数は Buzz、15 の倍数は FizzBuzz に置き換える。
FizzBuzz
プログラミング入門で最も有名な題材といえば FizzBuzz です。「1 から n までの数を順番に並べ、3 の倍数なら Fizz、5 の倍数なら Buzz、両方の倍数 (= 15 の倍数) なら FizzBuzz に置き換える」という単純なルールですが、条件分岐の 順序 と 重なり を扱う良い練習になり、面接の定番問題にもなっています。本レッスンでは、Python のリスト操作と条件分岐を組み合わせて、fizzbuzz(n) が長さ n のリストを返す形で実装します。
「条件が重なるときは、より厳しい条件を先に書く」 — FizzBuzz はこの教訓を体験させてくれる最高の演習です。
FizzBuzz のルール
本問題のルールは次の通りです。
1からnまでの整数を順番に処理する15の倍数なら"FizzBuzz"- それ以外で
3の倍数なら"Fizz" - それ以外で
5の倍数なら"Buzz" - それ以外は数字そのものを文字列にした
str(i)(例"1","2","4"...)
結果は 文字列のリスト として return します。例えば fizzbuzz(5) は ["1", "2", "Fizz", "4", "Buzz"] です。
ルールは紙に書き出してから手を動かすと、判定漏れを防げます。
文法を確認する
Python で「3 の倍数か」を調べるには i % 3 == 0 を使います。% は剰余演算子で、割り切れるなら 0 を返します。複数条件を同時に確認するなら and を使います。(i % 3 == 0) and (i % 5 == 0) は「3 と 5 の両方で割り切れる」、つまり 15 の倍数を意味します。リストを順番に組み立てるには、空リストに append するか、for 内包表記を使います。本問題ではどちらでも構いません。
Python
def fizzbuzz(n):
result = []
for i in range(1, n + 1):
if i % 15 == 0:
result.append("FizzBuzz")
elif i % 3 == 0:
result.append("Fizz")
elif i % 5 == 0:
result.append("Buzz")
else:
result.append(str(i))
return resultrange(1, n + 1) で 1 から n まで (両端含む) を生成します。range の終端は 含まない ので n + 1 と書く点に注意です。
動きを追ってみる
fizzbuzz(15) を頭の中で実行してみましょう。1 は何の倍数でもないので "1"、2 も同様で "2"、3 は 3 の倍数なので "Fizz"、5 は 5 の倍数なので "Buzz"、15 は 15 の倍数なので "FizzBuzz" となり、結果は ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"] です。
よくある間違い
- 条件の順番が逆 —
3の倍数判定を最初に書くと、15のときもFizzで返ってしまい、FizzBuzzには到達しません。厳しい条件 (= 倍数の組み合わせ) を先に書く のが鉄則です。 returnとprintの混同 —printでリストを表示しても、テストはreturnの値を見ます。必ずreturn resultを書きます。rangeの終端ミス —range(1, n)だとn自体が含まれません。range(1, n + 1)を使うか、range(n)の各値に+1するかで対処します。
FizzBuzz は単純そうで、書く順番を間違えるとあっさり壊れます。最初に
% 15を書く癖を付けましょう。
やってみよう
関数 fizzbuzz(n) を実装してください。1 から n までを上記ルールで変換した 文字列のリスト を返します。テストでは n = 1, 3, 5, 15, 16 などのケースで確認されます。動いたら、for 内包表記版 ["FizzBuzz" if i % 15 == 0 else ...] にも挑戦してみると、後の章で学ぶ内包表記の感覚を先取りできます。さらに発展として、n が 0 のときに空リスト [] を返す挙動も自然に成立することを確認してみましょう。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は デフォルト値と or で、1 から n までを判定し、3 の倍数は Fizz、5 の倍数は Buzz、15 の倍数は FizzBuzz に置き換える を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- FizzBuzz の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. FizzBuzz とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 1 から n まで (両端含む) を処理する
- 15 の倍数を先に判定して FizzBuzz を返す
- 数値そのものを返す場合は str(i) で文字列化する
入出力例
test-cases.txt
fizzbuzz(1) → ["1"]
fizzbuzz(3) → ["1","2","Fizz"]
fizzbuzz(5) → ["1","2","Fizz","4","Buzz"]
fizzbuzz(15) → ["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]
fizzbuzz(16) → ["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz","16"]
fizzbuzz(0) → []