Pythonラムダ式とは何ですか
ラムダ式は無名関数とも呼ばれます。定義するとき、特定の名前はありません。通常、1行の関数をすばやく定義するために使用されます。基本的な使用法を見てみましょう。
fun = lambda x:x+1
print(fun(1))
上記のコードを見ると、関数の行がラムダ式を使用して定義されており、関数名がなく、その後にx
で+1
動作する関数の関数が続くことがわかります。
構文を少し整理するには:
lambda [参数列表]:表达式
# 英文语法格式
lambda [arg1[,arg2,arg3....argN]]:expression
構文形式にはいくつかの注意点があります。
- ラムダ式は、lambdaキーワードを使用して定義する必要があります。
- lambdaキーワードの後、コロンの前にはパラメーターのリストがあります。パラメーターの数は0から任意の数までです。複数のパラメーターはコンマで区切られ、コロンの右側はラムダ式の戻り値です。
この記事の冒頭にあるコードを一般的な関数形式に書き直したい場合は、次のコードに対応します。
fun = lambda x:x+1
# 改写为函数形式如下:
def fun(x):return x+1
もちろん、上記fun()
も、無名関数にこれらの冗長な内容を含めないでください。次のように記述することもできます
が、コードの可読性が低下します。
print((lambda x:x+1)(1))
ラムダ式は通常、複数回使用する必要のない関数に使用され、関数が占有していたスペースは使用後に解放されます。
使い方
ラムダ式とdef定義関数の違い
最初のポイント:関数名のあるもの、関数名のないもの
2番目のポイント:ラムダ式の:
後
式は1つしか存在できず、複数のエラーが発生します。つまり、次のコードは表示されません。
# 都是错误的
lambda x:x+1 x+2
このため、多くの人がラムダ式を単一式関数と呼んでいます。
3番目のポイント:forステートメントはラムダでは使用できません
一部の場所では、ステートメントとprintステートメントをラムダ式で使用できない場合、説明が正確ではないと書かれています。たとえば、次のコードは正しいです。
lambda a: 1 if a > 10 else 0
基本的な結論として、ラムダ式には1つの式のみを含めることができ、複雑なステートメントを含めることはできません。式の操作の結果は、関数の戻り値になります。
4番目のポイント:ラムダ式は他のプログラム呼び出しと共有できません
5番目のポイント:ラムダ式は他のデータ型の値として使用できます。
たとえば、次のコードでは、ラムダ式に問題はありません。
my_list = [lambda a: a**2, lambda b: b**2]
fun = my_list[0]
print(fun(2))
ラムダ式のアプリケーションシナリオ
特定のコーディングシナリオでは、ラムダ式の一般的なアプリケーションは次のとおりです。
1.ラムダ式を変数に割り当ててから、変数を呼び出し
ます。上記の記述のほとんどはこの使用法です。
fun = lambda a: a**2
print(fun(2))
2.ラムダ式を他の関数に割り当てて、他の関数の関数を置き換えます。
一般に、これは特定の関数をシールドする場合です。たとえば、組み込みsorted
関数。
sorted = lambda *args:None
x = sorted([3,2,1])
print(x)
3.ラムダ式をパラメーターとして他の関数に渡す
一部の関数では、次の並べ替えコードなどの関数設定で無名関数を使用できます。
my_list = [(1, 2), (3, 1), (4, 0), (11, 4)]
my_list.sort(key=lambda x: x[1])
print(my_list)
my_list
変数はsort
関数パラメーターには、リスト内の各要素の2番目の項目でソートするようにkey
指示するラムダ式が割り当てられます。
4.ラムダ式をfilter、map、reduceの高階関数に適用します。
これは小さな穴を掘る場所であり、自分で拡張して学習することができます。
5.ラムダ式を関数の戻り値に適用します。
この手法により、関数の戻り値も関数であるという結論に達します。具体的なテストコードは次のとおりです。
def fun(n):
return lambda x:x+n
new_fun = fun(2)
print(new_fun)
# 输出内容:<function fun.<locals>.<lambda> at 0x00000000028A42F0>
上記のコードでは、ラムダ式は実際には、ネストされた関数または内部関数と呼ばれる関数内で定義された関数です。
同様に、ネストされた関数を含む関数は外部関数と呼ばれます。
内部関数は外部関数のローカル変数にアクセスできます。この機能はクロージャプログラミングの基礎です。SnowballingPythonの
第2ラウンドでは、クロージャプログラミングの知識を紹介する特別なブログがあります。
知識を広げる
ラムダ式には利点がありますが、ラムダを使いすぎないようにする必要があります。最新の公式PythonスタイルガイドであるPEP8では、次のようなコードを記述しないことを推奨しています。
normalize_case = lambda s: s.casefold()
したがって、関数を作成して変数に格納し、を使用def
して定義します。
不要なカプセル化
絶対サイズによるリストソートを実装します。
my_list = [-1,2,0,-3,1,1,2,5]
sorted_list = sorted(my_list, key=lambda n: abs(n))
print(sorted_list)
上記はラムダ式を使用しているようですが、Pythonのすべての関数をパラメーターとして渡すことができることを忘れました。
my_list = [-1,2,0,-3,1,1,2,5]
sorted_list = sorted(my_list, key=abs)
print(sorted_list)
つまり、要件を満たす関数がある場合、ラムダ式を追加で使用する必要はありません。