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に他に何があるか知っているなら、私はすべてを持っています-私はコメントで尋ねます。
質問とフィードバックもあります。



Source: https://habr.com/ru/post/J336160/


All Articles