PythonはいつLamband関数を使うべきですか?


Pythonには定義関数には2つの方法があります。一つは従来方式のdefで定義し、関数は名前を指定します。二つ目はlambandで定義します。名前を指定する必要はなく、Lambada関数といいます。
Lambda関数は匿名関数と呼ばれています。匿名関数は名前のない関数です。関数は名前がなくてもいいです。もちろんいいですよ。一部の関数は一時的に使うだけで、その業務ロジックも簡単な場合、名前を付けなくてもいいです。
例えば映画の中の大衆の俳優のように、彼らの芝居は少ないです。一番多いのは主演を引き立てることです。いらないです。彼らは臨時に鏡を出すだけですから、今度はいらないかもしれません。彼らに名前を作ってあげます。優雅な名前をつけるのは大変です。
まず簡単なlamda関数を見てください。

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>
xとyは関数の二つのパラメータで、コロンの後の表現は関数の戻り値です。この関数は二つの変数の和を求めていることが一目で分かりますが、一つの関数として名前がない場合はどう使いますか?ここではとりあえずこの匿名関数に名前を付けます。これによって匿名関数の呼び出しが可能になります。

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3
これは従来の関数と同じです。

>>> def add2(x, y):
... return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3
匿名関数を定義して名前を結び付けると、ちょっと蛇足があります。通常は直接にlamban関数を使います。lamdba関数の正確な使用シーンはどこですか?
1、関数プログラミング
Pythonは純粋な関数式プログラミング言語とは言えませんが、それ自体は多くの関数式プログラミングの特性を提供しています。map、reduce、filter、sortedなどの関数はパラメータとして機能をサポートしています。
問題を見てください。整数のリストは、リストの要素の絶対値の大きさによって昇順に並べられます。どうしますか?1分間考えて下を見る。

>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]
並べ替え関数sortedは、パラメータとして受信した関数をサポートしています。このパラメータはsortedの並べ替えの根拠として、ここでリスト要素の絶対値によって並べ替えられます。もちろん、普通の関数でも実行できます。

>>> def foo(x):
... return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
この方式のコードはPythonicに足りないように見えるだけです。
2、クローズド
クローズド自体は分かりにくい概念です。個々の文章で紹介することができますが、ここでは簡単に粗暴にクローズドということができます。これは関数の内部に定義された関数です。クローズドは変数をその関数のスコープから離れてもアクセスできます。
ラmbada関数をクローズドとして使用する例を見てください。

>>> def my_add(n):
... return lambda x:x+n
...
>>> add_3 = my_add(3)
>>> add_3(7)
10
ここのlamda関数はクローズドです。グローバルスコープの中で、add_3(7)正常に実行でき、かつ、戻り値が10であるため、10に戻るのはmy_add局所作用領域では、変数nの値がクローズドされており、グローバルスコープでもアクセスできるようになっている。
従来の関数に置き換えると、クローズドが可能になりますが、このような方法はややくどいです。

>>> def my_add(n):
... def wrapper(x):
... return x+n
... return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7
どのような状況でも従来の関数よりはlamda関数がはっきりしていますか?この例を見てください

f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
これはある集合に戻ってくるすべてのサブセットのラボラダ関数です。分かりましたか?私は目に見えにくいです。
zen of pythonにはExplicit is better than implicitという言葉があります。覚えてください。lamda関数でコードをより明確にできない場合は、関数を定義するために従来の方法を考える必要があります。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。