pythonの内包表記でFizzBazz問題を解いてみた【python初心者】


pythonのループ処理について、for文より内包表記のほうが速くて簡潔に書けるので
オススメ!的な記事をよく見かけたので、実際どれくらい早くなるのかFizzBazz問題で試してみました。

目次

  1. FizzBazz問題について
  2. 解答
  3. 結論

2021/8/8 ソースコード(main.py) 全体的に修正
2021/8/9 ソースコード(main.py) 全体的に修正

1.FizzBuzz問題について

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」を、
5の倍数のときは「Buzz」と出力し、
3と5の両方の倍数のときには「FizzBuzz」と出力すること。

有名な問題で、上記の要件を満たすプログラムの作成が目的となります。

2.解答

main.py
import time

def fizzBuzz(list):

    #for文の場合
    # result = []
    # for i in list:
    #     if(i % 15 == 0):
    #         result.append('fizzBazz')
    #     elif(i % 5 == 0):
    #         result.append('bazz')
    #     elif(i % 3 == 0):
    #         result.append('fizz')
    #     else:
    #         result.append(str(i))

    #内包表記の場合
    result = ["fizzBazz" if number%15 == 0 else
                'Buzz' if number % 5 == 0 else
                'Fizz' if number % 3 == 0 else
                number
                for number in list]

    return result

def main():

    #連番の配列
    number_list = range(1, 101)
    fizzBuzz_list = fizzBuzz(number_list)

    #fizzBazz問題の回答
    for answer in fizzBuzz_list:
        print(answer)

if __name__ == '__main__':
    try:
        # 時間計測開始
        time_start = time.time()
        # 処理を書く(ここでは1秒停止する)
        main()
        # 時間計測終了
        time_end = time.time()
        # 経過時間(秒)
        time = time_end - time_start
        #処理時間
        print('################################')
        print('処理時間: ' + str(time))
    except Exception as error:
        #例外エラー
        print(error)

実行結果

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
fizzBazz
~中略~
97
98
Fizz
################################
処理時間: 4.649162292480469e-05
  • main()関数で普通にFizzBazz問題を解く
  • 内包表記でどれくらい早くなるかmain()関数の実行前後で処理時間を計測

なかなか平凡な解答になりました。
そこそこ、簡潔なコードになりました。

結論

実行速度の差は分からないが記述量は減る

fizzBuzz()内のコメントアウトしたfor文で書いたロジックと比べると
コード量が少なくスッキリします。

実行速度については比較しては見たのですが明確な差は出ませんでした。
負荷や処理量を増やすため、連番のリストを100から100万まで増やしてみたりしましたが
特に処理時間に差は出なかったです。