kakashi-blog・カカシブログ・

Python備忘録を書きドローンやバイクなど好きな事で生きて行こうとしているブログ

Python

PythonでFizzBuzz問題を書く|3通りの書き方と1行コード

投稿日:2020年1月23日 更新日:

プログラミングの入門でよく出てくる「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)

言葉で流れを書くと

  1. for文で、1から100までくり返します
  2. 3で割り切れるかを判断します。割り切れたら、さらに5で割り切れるかを判断し、割り切れれば「FizzBuzz」、割り切れなければ「Fizz」を出します
  3. 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言語の基本から仕事のやり方まで

-Python
-

執筆者:


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

関連記事

Seleniumの使い方入門|ブラウザを開いてスクロールする

Pythonでウェブブラウザを動かしてみたいと思い、Seleniumというライブラリを使ってみました。この記事では、Chromeを自動で開いて、ページを一番下までスクロールし、また一番上に戻るところま …

Python Tkinter入門|ウインドウ・ラベル・入力欄・ボタンの基本

PythonのTkinter(ティーケーインター)を使うと、ボタンや入力欄のある画面(GUI)を作れます。この記事では、ウインドウを開いて、ラベル、テキストの入力欄、ボタンを付けるまでの基本をまとめま …

PythonでExcelを操作する方法|openpyxlの基本

Pythonの勉強で覚えた、Excelを操作する方法をまとめました。初心者向けの備忘録です。 結論から言うと、openpyxlで load_workbook() で開き、wb[‘シート名’] でシート …

カプレカ数をPythonで求める|20桁まで一気に計算

6174や495のような「カプレカ数」を、Pythonで求めてみました。 結論から言うと、1つずつ数字を調べる方法では、5分回しても6個目が出てきませんでした。ところが、数字の並べ方(組み合わせ)で調 …

Seleniumで自動ログインする方法|Python備忘録

前回はSeleniumでブラウザをスクロールさせました。今回は、ログイン画面にIDとパスワードを自動で入力して、ログインするところまでやってみます。 結論から言うと、開発者ツール(F12)で入力欄とボ …