Pythonの教科書で、breakとcontinueの説明で、fizzbuzzがありました。3で割り切れる場合はfizzで、5で割り切れる場合はbuzzで両方で割り切れる場合、つまり15で割り切れる場合はfizzbuzzと出力します。ある参考書では、(名前は不明)breakとcontinueは使わないでも、書けると説明がありました。
ifとelseを素直に対応させていくと、上のようになると思います。
elifを使っても書けます。一番わかり易いのかもしれません。
Pythonの教科書で、breakとcontinueの説明で、fizzbuzzがありました。3で割り切れる場合はfizzで、5で割り切れる場合はbuzzで両方で割り切れる場合、つまり15で割り切れる場合はfizzbuzzと出力します。ある参考書では、(名前は不明)breakとcontinueは使わないでも、書けると説明がありました。
ifとelseを素直に対応させていくと、上のようになると思います。
elifを使っても書けます。一番わかり易いのかもしれません。
["fizzbuzz" if i % 15 == 0 else "fizz" if i % 3 == 0 else "buzz" if i % 5 == 0 else i for i in range(1, 21)]
なんて書き方がありますね。
どうしてもprintしたい、とか言うなら例えば
[print(j) for j in ["fizzbuzz" if i % 15 == 0 else "fizz" if i % 3 == 0 else "buzz" if i % 5 == 0 else i for i in range(1, 21)]]
と言うワンライナーがあります。
単純こそ全て、難しいことは基本、得意でないのです。
なるほど。
敢えていうと、Pythonを使う場合は、例えばC言語等の手続き型言語とちょっと違う発想を要します。
Pythonって言語は設計の初期段階で関数型言語の影響が濃かったのです(実はオブジェクト指向よりそっちの実装の方が早かった模様です)。
ファーストクラスの関数、高階関数と言う機能等、その辺色々と「データをフィルタリング・加工」する発想を関数型言語からたくさん取り入れていて、言い換えるとC言語の影響なんてあまり無いんです。
特に顕著なのがプログラミング言語Haskellから借りてきたリスト内包表記です。
Python2.0から登場した機能ですが、これがPython従来の関数型言語的な機能をまとめました。フィルタリングやデータ改造等思いのまま、です。
リスト内包表記:
https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions
C言語からPythonに来た人とかは比較的嫌ってますが、生え抜きのPythonistaなんかは大好物な機能です。
そして、特筆すべきはフツーのfor文なんかより速いんですよ。最適化が施されています。
Pythonを使うならリスト内包表記を使わないでどうすんだ、ってくらい愛されてる機能です。
是非ともリスト内包表記を愛用してください。
ああ、なるほど。
うん、ScalaってRubyに近いんですが、両者とも関数型言語の影響が濃い言語ですね。僕はScalaそのものは触ったことはないですが・・・・・・(TwitterがRubyからScalaに変えたのはその辺でしょうけど)。
と言う事はisamさんは関数型言語の勉強をした、って考えていいと思います。