FizzBuzz

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

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. 1 から n までの整数を順番に処理する
  2. 15 の倍数なら "FizzBuzz"
  3. それ以外で 3 の倍数なら "Fizz"
  4. それ以外で 5 の倍数なら "Buzz"
  5. それ以外は数字そのものを文字列にした 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 result

range(1, n + 1)1 から n まで (両端含む) を生成します。range の終端は 含まない ので n + 1 と書く点に注意です。

動きを追ってみる

fizzbuzz(15) を頭の中で実行してみましょう。1 は何の倍数でもないので "1"2 も同様で "2"33 の倍数なので "Fizz"55 の倍数なので "Buzz"1515 の倍数なので "FizzBuzz" となり、結果は ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"] です。

diagram (will load when visible)

よくある間違い

  1. 条件の順番が逆3 の倍数判定を最初に書くと、15 のときも Fizz で返ってしまい、FizzBuzz には到達しません。厳しい条件 (= 倍数の組み合わせ) を先に書く のが鉄則です。
  2. returnprint の混同print でリストを表示しても、テストは return の値を見ます。必ず return result を書きます。
  3. 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 ...] にも挑戦してみると、後の章で学ぶ内包表記の感覚を先取りできます。さらに発展として、n0 のときに空リスト [] を返す挙動も自然に成立することを確認してみましょう。

よくある質問

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 つができることを確認しましょう。

  1. FizzBuzz の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. FizzBuzz とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 1 から n まで (両端含む) を処理する
  2. 15 の倍数を先に判定して FizzBuzz を返す
  3. 数値そのものを返す場合は 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)[]

ヒント

main.py
main.py
学習モード

メモ

FizzBuzz

⌘S で保存