無名関數(shù)
非常に短いコールバック関數(shù)を定義することを考えたことはありますが、def を使用してそのような長(zhǎng)い関數(shù)を記述したくないですか? ショートカットはありますか?答えは「はい」です。
Python はラムダを使用して匿名関數(shù)を作成します。つまり、関數(shù)の定義に標(biāo)準(zhǔn)形式の def ステートメントは使用されなくなりました。
匿名関數(shù)には主に次の特徴があります。
lambda は単なる式であり、関數(shù)本體は def よりもはるかに単純です。
ラムダの本體は式であり、コード ブロックではありません。ラムダ式にカプセル化できるロジックは限られています。
ラムダ関數(shù)には獨(dú)自の名前空間があり、獨(dú)自のパラメータ リストの外部またはグローバル名前空間內(nèi)のパラメータにアクセスできません。
基本構(gòu)文
lambda [arg1 [,arg2,.....argn]]:expression
例:
# -*- coding: UTF-8 -*- sum = lambda num1 , num2 : num1 + num2; print( sum( 1 , 2 ) )
出力結(jié)果:
3
注:ラムダ式を使用すると、次のことが可能になります。単純な関數(shù)を定義できますが、その用途は限定されています。指定できる式は 1 つだけであり、その値が最終的な戻り値となります。つまり、複數(shù)のステートメント、條件式、反復(fù)、例外処理などの他の言語機(jī)能を含めることはできません。
匿名関數(shù)には、注意が必要な特別な問題があります。たとえば、上記の例を変更します:
# -*- 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、結(jié)果はそうではありません。出力結(jié)果は次のようになります:
10001 10001
これは主に、ラムダ式の num2 が自由変數(shù)であり、値がバインドされているためです。 runtime を定義する際にバインドするのではなく、関數(shù)のデフォルト値パラメータ定義とは異なります。したがって、この狀況が発生した場(chǎng)合は、最初の解決策を使用することをお?jiǎng)幛幛筏蓼埂?