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