python学び日記3~FizzBuzz~
今回はすごく軽い内容。
というかほとんどおふざけみたいなもの。
pythonはまだ学んでほんの少しだけど他の言語は昔からやってたから結構な頻度で人にプログラミングを教える機会があります。こんな奴に、、
自分はあまりコーディングのセンスはないと自負しておりますので現場で褒められることは少ないですが、教えてるとわかりやすいとよく言われるので結構嬉しかったりします。
で、教えてる中で久しぶりに見たのがFizzBuzz問題。
有名すぎるから問題内容は割愛。
まあ検索すれば山ほど出てきます。
一番愚直に書くとこう
for i in range(1, 101):
if i % 15 == 0:
print("Fizz Buzz!")
elif i % 3 == 0:
print("Fizz!")
elif i % 5 == 0:
print("Buzz!")
else:
print(i)
あと、いろいろ見たのは、if の条件分岐が効率化されていたり、表示する文字列をリストでAppendして最後にprintするやつ。
で教えてて自分もpythonは初心者みたいなもんだからFizzBuzz書いてみようかな。でもあんまりない書き方をしたいな。
「python」「スマート」=内包表記
でしょ。ってことで内包表記で書いてしまおう。と思ったが検索したらあった、、、それが以下
["FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else n for n in range(1,31)]
ここでおわったらさすがに寝れない。個人的にif else がずっと直列で続いてるのとstringが内包表記内に直接入ってるのいやだなあと思ったので作ったのが以下
dic={F*B:'FizzBuzz',F:'Fizz',B:'Buzz'}
print(" ".join([dic[func(num)[0]] if any(func(num)) else str(num) for num in range(1,N+1) for func in [lambda n:[i for i in dic.keys() if n%i==0]]]))
なんかもう直近で覚えたやつ全部詰め込みましたみたいな汚いやつ。
(F=3,B=5,N=100)
lambda式をつかってみたかったんや、、
言い訳じゃないのですが、、、
こんな汚いのだけじゃなくてこんな感じにスマートなやつも思いついたのですが、、スマートなのは似たようなものがすでにネットにありました
print(" ".join(["Fizz"*(num%F==0) + "Buzz"*(num%B==0) or str(num) for num in range(1,N+1)]))
やっぱり自分には才能がなかった、、でも自分で考えたっていうのが大事だと信じてる!!