無名関数
非常に短いコールバック関数を定義することを考えたことはありますが、def を使用してそのような長い関数を記述したくないですか? ショートカットはありますか?答えは「はい」です。
Python はラムダを使用して匿名関数を作成します。つまり、関数の定義に標準形式の def ステートメントは使用されなくなりました。
匿名関数には主に次の特徴があります。
lambda は単なる式であり、関数本体は def よりもはるかに単純です。
ラムダの本体は式であり、コード ブロックではありません。ラムダ式にカプセル化できるロジックは限られています。
ラムダ関数には独自の名前空間があり、独自のパラメータ リストの外部またはグローバル名前空間内のパラメータにアクセスできません。
基本構文
lambda [arg1 [,arg2,.....argn]]:expression
例:
# -*- coding: UTF-8 -*- sum = lambda num1 , num2 : num1 + num2; print( sum( 1 , 2 ) )
出力結果:
3
注:ラムダ式を使用すると、次のことが可能になります。単純な関数を定義できますが、その用途は限定されています。指定できる式は 1 つだけであり、その値が最終的な戻り値となります。つまり、複数のステートメント、条件式、反復、例外処理などの他の言語機能を含めることはできません。
匿名関数には、注意が必要な特別な問題があります。たとえば、上記の例を変更します:
# -*- coding: UTF-8 -*- num2 = 100 sum1 = lambda num1 : num1 + num2 ; num2 = 10000 sum2 = lambda num1 : num1 + num2 ; print( sum1( 1 ) ) print( sum2( 1 ) )
出力はどうなると思いますか?最初の出力は 101、2 番目の出力は 10001、結果はそうではありません。出力結果は次のようになります:
10001 10001
これは主に、ラムダ式の num2 が自由変数であり、値がバインドされているためです。 runtime を定義する際にバインドするのではなく、関数のデフォルト値パラメータ定義とは異なります。したがって、この状況が発生した場合は、最初の解決策を使用することをお勧めします。