Pythonの関数型プログラミング手法

こんにちは、Habr!

この記事では、関数型プログラミング言語からPythonにもたらされたものについてお話したいと思います。 猫の下で興味を持ってください。







リストジェネレーター



それは簡単でシンプルです:代わりに







l = [] for x in range(10): if x % 2 == 0: l.append(x)
      
      





私たちは書いています







 l = [x for x in range(10) if x % 2 == 0]
      
      





短くて明確。







関数型言語での仕組み

Haskellでは、同じことは次のようになります。







 let l = [x | x <- [0..10], x `mod` 2 == 0]
      
      





ラムダス



グラフィカルインターフェイスを作成し、ボタン(** kwargs)関数があるとします。有効な名前付き引数は、テキストのテキスト、幅の幅、高さの高さ、コールバック関数のコマンドです。







 def callback(event): print("Button pressed") button(text="Press me", width=32, height=16, command=callback)
      
      





コールバックがどれほど小さいかに注目してください。引数でプッシュするのは本当に簡単ですか? できます! ラムダは私たちを助けます:







 button(text="Press me", width=32, height=16, command=lambda x: print("Button pressed"))
      
      





清潔で簡単!







関数型言語での仕組み

Haskellでは、引数として関数を渡すことはすべてのステップで発生します。たとえば、map関数は関数とリストを受け取り、この関数が適用された各要素のリストを返します。







 map (\x -> x+1) [1..10]
      
      





Pythonでは、これは次のとおりです。







 map(lambda x: x+1, [x for x in range(1, 10)])
      
      





確かに、Pythonにはマップはありません。

upd:マップは!







キャリング



カリー化とは、1つ以上の引数を古い関数に渡して、残りを引き継ぐ新しい関数を取得することです(より正確な定義についてはAnutaUに感謝します)。 例えば:printは関数です(私はPython 3を使用しています)。名前付き引数endがあります-行の終わり。デフォルトでは "\ n"です。 新しい行にジャンプしたくない







 print(str, end="")
      
      





新しい行にジャンプしないprintf関数を作成しましょう







 def printf(*args, **kwargs): kwargs["end"] = "" print(*args, **kwargs)
      
      





ずさんな、それは可能であり、簡単です:







 from functools import partial printf = partial(print, end = "")
      
      





ここにカレーがあります-私たちは欲しいものを言います まったく同じですが、マザーオブパールボタン 関数を印刷しますが、そのため、末尾は ""と等しくなります。 すべてがシンプルです。







関数型言語での仕組み

そして再びHaskell:2つの引数を取る+関数があります:







 let plusTwo = (+2)
      
      





これで、1つの引数に2を追加する関数ができました。







あなたが機能主義からPythonに他に何があるか知っているなら、私はすべてを持っています-私はコメントで尋ねます。

質問とフィードバックもあります。








All Articles