検索

キーワード


目次

PythonでFizzBuzz問題を解いてみよう!【初心者向け解説記事】

  • 公開日:2023-05-06 21:13:16
  • 最終更新日:2023-07-24 20:38:45
PythonでFizzBuzz問題を解いてみよう!【初心者向け解説記事】

Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!

フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。

FizzBuzz問題とは?

まず、当記事を読み進める前に、以下の記事に書かれている内容を理解する必要があります。

Pythonにおける変数の使い方【初心者向け解説記事】

Pythonにおける演算子の使い方【初心者向け解説記事】

Pythonの条件分岐-if,else,elif,の使い方【初心者向け解説記事】

pythonにおける繰り返し(for, while)【初心者向け解説記事】

FizzBuzz問題とは、プログラミング初学者に広く知られる簡単なアルゴリズム問題で、1から100までの数字について、以下の条件に合った出力を行います。

  • 3の倍数のときは「Fizz」を出力
  • 5の倍数のときは「Buzz」を出力
  • 3の倍数かつ5の倍数のときは「FizzBuzz」を出力
  • それ以外の場合は数字そのものを出力

この問題は、プログラミング言語の基本構文や繰り返し処理の理解度を測るのによく使われます。まずは自力で考えてみましょう!

自力で解くのが難しい場合は、以下のヒントを参考にしてください。


FizzBuzz問題のヒント

ヒント1.倍数かどうかの判定

剰余演算子(%)を使用して、数値が3または5の倍数であるか判定します。

例: i % 2 == 0 は、iが2の倍数である場合にTrueとなります。


ヒント2.処理を場合分けする方法

条件分岐(if, elif, else)を使用して、Fizz、Buzz、FizzBuzz、または数値を適切に出力します。

先に「FizzBuzz」の条件をチェックし、次に「Fizz」や「Buzz」の条件を判定し、最後にそれ以外の場合を処理します。

ヒント3.100まで処理する方法

同じ処理を100回書いても解くことは出来ますが、繰り返し処理(forループまたはwhileループ)を使用して、100までの数値を順番にチェックする方法が簡単です。


PythonでのFizzBuzzの実装方法(答え)

forループを使用した実装

forループを使ってFizzBuzzを実装する例を示します。

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


whileループを使用した実装

whileループを使ってFizzBuzzを実装する例を示します。

i = 1
while i <= 100:
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
    i += 1


出力

出力は以下のようになります。ご自身で書いたコードが例と異なっていても、出力が同様なら正解です。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

(中略)

FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz


色々な解法

前述したように、この問題の解法は一つではありません。関数やリスト、内包表記などを用いて様々な形で書くことができます。

初心者向けではない解法も含まれているので、参考程度にしてください。


1.一度に条件判定

3で割り切れるか、5で割り切れるか、両方で割り切れるかを一度に判定することで、コードを短縮できます。

for i in range(1, 101):
    print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)

このコードについて解説をします。


'Fizz' * (i % 3 == 0)

i % 3 == 0という条件式を評価し、3で割り切れる場合はTrue、そうでない場合はFalseを返します。Trueは1、Falseは0として扱われます。'Fizz' * 1は'Fizz'を返し、'Fizz' * 0は空文字列('')を返します。


'Buzz' * (i % 5 == 0)

同様に、i % 5 == 0という条件式を評価し、5で割り切れる場合はTrue、そうでない場合はFalseを返します。'Buzz' * 1は'Buzz'を返し、'Buzz' * 0は空文字列('')を返します。


'Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i

ここで、FizzとBuzzの両方の条件式の結果を組み合わせます。3でも5でも割り切れる場合は、'FizzBuzz'になります。どちらか片方の条件だけが満たされる場合は、'Fizz'または'Buzz'になります。どちらの条件も満たさない場合は、「'Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) 」の部分が空文字列(’’)になります。これはFalseとして扱われるので、「False or i」と同様になり、元の数字iが出力されます。iは1以上の数字で、これは条件式で扱うとTrueとして扱われます。


2.関数の利用

繰り返し使われる処理を関数化することで、コードの再利用性を向上させ、可読性を向上させることができます。関数については以下の記事で解説しています。

Pythonにおける関数の定義と使用【初心者向け解説記事】 (forward-soft.co.jp)

def fizzbuzz(n):
    if n % 15 == 0:
        return "FizzBuzz"
    elif n % 3 == 0:
        return "Fizz"
    elif n % 5 == 0:
        return "Buzz"
    else:
        return n

for i in range(1, 101):
    print(fizzbuzz(i))


3.リスト内包表記

リスト内包表記を使うことで、コードを短く書くことができますが、可読性が落ちやすいです。

リスト内包表記についてはPythonにおけるリスト内包表記についてで詳しく解説しています。

print('\n'.join(['Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or str(i) for i in range(1, 101)]))

このコードについて解説をします。


'Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0):

1.一度に条件判定で解説した通りです。


or str(i)

'Fizz'、'Buzz'、または'FizzBuzz'が出力されない場合、iを文字列型に変換して出力します。文字列型に変換しないと、join関数を使う際にエラーになります。


[... for i in range(1, 101)]

1から100までの各iに対して、上記の処理を行い、リストと呼ばれるデータ構造にまとめます。


'\n'.join(...)

リストの要素を改行文字(\n)で区切って1つの文字列に結合します。


4.さらに短くしてみる(参考)

Pythonにおける、世界最短のFizzBuzz問題の実装です。

for i in range(100):print(i%3//2*"Fizz"+i%5//4*"Buzz"or-~i)

説明は長くなるので割愛します。

このコードは短いですが、理解できる人は少ないと思うので、必ずしも短いコードが分かりやすいというわけではないです。しかし、個人でどれだけコードを短くできるか学習する分には、いろいろな技術が身について勉強になることも多いです。


まとめ

FizzBuzz問題は、プログラミング初学者にとって重要な問題であり、制御構造や条件分岐、繰り返し処理の基本を学ぶ上で有益です。また、この問題を解くことで、プログラムの効率性や可読性を意識するようになり、コーディングスキルの向上に繋がります。さらに、様々な実装方法を試すことで、プログラミング言語の特性を理解し、柔軟な発想力を育てることができます。コーディングで問題を解かせるサイトもあるので、検索して解いてみるのも良いプログラミングの練習になるでしょう。


【著者】

ゆうさい

フォワードソフト株式会社のエンジニア。Java、Python、JavaScript、C#などの言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をする方法を考えるのが好きです。 最近はジェネレーティブAIの業務利用に関する検証を行っています。 資格を通じて知識を吸収することを心がけており、セキュリティスペシャリスト、データベーススペシャリスト、応用情報技術者、Oracle Certified Java Programmer Gold SE 11、Pythin3 エンジニア認定試験、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。

編集した記事一覧

正社員/フリーランスの方でこのようなお悩みありませんか?

  • 自分に合う案件を定期的に紹介してもらいたい
  • 週2、リモートワークなど自由な働き方をしてみたい
  • 面倒な案件探し・契約周りは任せて仕事に集中したい

そのような方はぜひ、Workteriaサイトをご利用ください!

  • 定期的にご本人に合う高額案件を紹介

  • リモートワークなど自由な働き方ができる案件多数

  • 専属エージェントが契約や請求をトータルサポート