一行でFizzBuzz!
初心者向けの解説です。おそらく私の別の記事から飛んできてくれた方が多いのかな?
Pythonに限らずプログラミング言語を学び始めたら”FizzBuzz”を書くようなこともあるかもしれませんねw
そんなあなた向けにワンラインで書ける”FizzBuzz”を、解説含め紹介したいと思います。
FizzBuzzのプログラム
通常のFizzBuzz
“通常の”と言っていいのかはわかりませんが、まず普通のfor文とif文を使った”FizzBuzz”の説明と解説をしていきたいと思います。
「そんなのもう完璧だよ!」という方は飛ばしていただいてかまいません。
さて普通の”FizzBuzz”ですが、こんな感じに書くことが多いのではないでしょうか?
for i in range(1,50): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i)
こちらはもう簡単ですねw
for i in range(1, 50):
で1から50未満の整数までiを増やしながらループするという意味です。
if i % 15 == 0: print("FizzBuzz")
2行目でif文を使い iを15で割った余りが0だったら、つまり15で割り切れたら3行目を実行します。
今回の場合、
print("FizzBuzz")
を実行します。
print()は画面に文字を出力するときの処理ですね!
15で割ったあまりが0だった時の処理を3や5で割ったときの処理よりも先にするのは、例えばiが15だった場合、”FizzBuzz”を出力したいのに3でも割り切れてしまうので”Fizz”が出力されてしまいますね!
そのため先に15で割り切れるか調べているのです。
ワンラインFizzBuzz
さて、それではワンラインで書けるFizzBuzzの解説です。
まずはプログラムを載せますね!
print("\n".join((i % 3 == 0)*"Fizz" + (i % 5 == 0)*"Buzz" or str(i) for i in range(1, 150)))
こんな感じです!
可読性は悪いですがしっかり一行で書けていますね。
それでは早速解説をしていきます。
コードがよくわからないときは()ごとに中身を分けていくことをお勧めします。
今回の場合
print() # 一番上位のプログラム "\n".join() # 二番目に上位のプログラム for i in range(1, 150) # 三番目に上位のプログラム (i % 3 == 0)*"Fizz" + (i % 5 == 0)*"Buzz" or str(i) # まとめて四番目に上位のプログラム
四番目のプログラムから内容を理解していきましょう。
まず、”or“という文字が見えますが、これは”or“の左が”True“ならば左を実行する。
そうでないならば右を実行するという意味です。
例えば、iが6の時(i % 3 == 0) という式は正しいです。つまりTrueを返します。数字で表すと1ですね。すると(i % 3 == 0)*”Fizz” + (i % 5 == 0)*”Buzz”この部分は1*”Fizz”を表していることになるので“Fizz” or str(i)ということになります。
文字列もorで比較するとTrueを返すので最終的にiが6の場合はFizzを返すことになります。
次に、iを決めるプログラムですが、for i in range(1, 150)この部分になります。
式 for 変数1 in range(範囲)で範囲の間で変化する変数を式に使うことができます。
今回の場合式というのは(i % 3 == 0)*”Fizz” + (i % 5 == 0)*”Buzz”これですね
1から50未満の間でひとつづつ式に入れてみるとFizzBuzzの実行結果のような値が取れると思います。
このfor文の使い方はリストの作成にも向いていて[i * 2 for i in range(5)]とすると[0, 2, 4, 6, 8]のようなリストを作れたりします。
続いて“\n”.join()このプログラムですが、文字を連結します。\nという改行コードの前に()の中の結果(今回の場合は[1, 2, “Fizz”, 4, “Buzz”, …]となるジェネレータオブジェクト)の間に文字列(今回の場合は”\n”)を入れます。
そうすると
1\n2\n"Fizz"\n4\n"Buzz"\n...
という風になりますよね?\nは改行コードなので改行すると
1 2 "Fizz" 4 "Buzz" ...
という風になるのがわかると思います。
最後にこれをプリントしています。
以上です。
少し疲れたのでこのあたりで終わりにしたいと思います。
画像付きで解説してたりするので他の記事も見て行ってもらえると嬉しいです!
コメント