Rubyの経験を持ちながら、私はPythonを学び、リスト変換技術(select/map/reduce)をPythonにマップしました。 私はリスト[0..99]を取り、正方形の偶数を取り出して要約したいとしましょう。 PythonでPythonのRubyと比較した処理リスト
:これまでのところ、それは罰金と慣用的に見えるPythonでRubyの
(0..99)
.select {|num| num % 2 == 0}
.map {|num| num*num}
.inject {|sum, n| sum + n}
で
arr = range(100)
res = [x*x for x in arr if x % 2 == 0]
res = reduce(lambda x,y: x+y, res)
。 ここで、偶数を四角形にした後、10で割り切れるものを100で割った後、奇数を選択したいというマッピング/フィルタリングを追加したいとしましょう。それはにうまくスケールRubyでは
:Pythonでは、コードはそうのようになって
(0..99)
.select {|num| num % 2 == 0}
.map {|num| num*num}
.select {|num| num % 10 == 0}
.map {|num| num/100}
.select {|num| num % 2 != 0}
.inject {|sum, n| sum + n}
:
arr = range(100)
res = [x*x for x in arr if x % 2 == 0]
res = [x for x in res if x % 100 == 0]
res = [x/100 for x in res]
res = [x for x in res if x % 2 != 0]
res = reduce(lambda x,y: x+y, res)
それはここでPythonのコードのように感じている(私は巣でし効率的ではない慣用とではありません
それは読めなくなるだろう)。 また、Rubyのコードは、Pythonコードについて言えない怠惰な評価のために簡単に修正することができます。 このアイデアとよく読みやすく効率的なコードをPythonでどのように表現すればよいですか?
2番目の例は、最初の例よりも慣用で効率的ではありません。彼らは私とほぼ同じように見えます。 – Kwarrtz
@Kwarrtzストリームの連鎖を壊し、各ステップを変数に割り当てるということは、それが慣用的で効率的ではないことです。これにより、インタプリタ(IMHO)がコードを最適化できないようにする必要があります。しかし、私はここでちょうど推測しています。 – Andrei
うまくいけば、内包物はその問題を解決するはずです。 – Kwarrtz