Python学習シリーズのlambda式

5637 ワード

一、lambdaの定義と使い方lambda式は、1行の関数です.他の言語では匿名関数とも呼ばれています.すなわち,関数には具体的な名前はなく,defで作成する方法には名前がある.プログラムで1つの関数を2回使用したくない場合は、通常の関数と全く同じlambda式を使用したいかもしれません.また,関数をパラメータとして使用する場合,lambda式は非常に有用であり,コードを簡単で簡潔にすることができる.lambda式はfunctionタイプを返し、関数タイプであることを示します.
""名前付きfoo関数""
def foo():return 'beginman'  #Python              

「lambdaキーワード匿名関数を作成します.この式は上記の関数と同じです」
lambda:'beginman'   

上は単純にlambdaで関数オブジェクトを作成しただけで、保存も呼び出しもせず、いつも回収されます.ここでは、保存して呼び出す:保存後、関数オブジェクトは関数名に相当します.
bar = lambda:'beginman'
print bar()     #beginman

プロトタイプ
Lambda文では、コロンの前にパラメータがあり、複数あり、カンマで区切られ、コロンの右側の戻り値があります.Lambda文は、実際には関数オブジェクトを構築します.
パラメータがない場合、lambdaコロンの前には、上記の例のようにありません.
lambda   :  (  )
lambda [arg1[,arg2,arg3....argN]]:expression

    add = lambda x, y: x + y

    print(add(3, 5))
    # Output: 8

これには、いくつかのlambda式の適用例があり、いくつかの特殊な場合に使用できます.
リストのソート
    a = [(1, 2), (4, 1), (9, 10), (13, -3)]
    a.sort(key=lambda x: x[1])

    print(a)
    # Output: [(13, -3), (4, 1), (1, 2), (9, 10)]

リストの並列ソート
    data = zip(list1, list2)
    data = sorted(data)
    list1, list2 = map(lambda t: list(t), zip(*data))

二、lambdaと命名関数の違い
1、lambdaは受信変数を作成しません.
defの作成方法は名前がありますが、lambdaはありません.すぐに渡すことができます(変数は必要ありません).python lambdaは関数オブジェクトを作成しますが、この関数オブジェクトは識別子に割り当てられません.defは関数オブジェクトを変数(関数名)に割り当てます.次のようになります.
>>> def foo():return 'foo()'
>>> foo

2、python lambdaはただの式で、defは文です.
Lambda式は関数のように動作し、呼び出されたときにフレームワークオブジェクトを作成します.
したがって,文ネストはdef,式ネストはlambdaを用いる.
例:
a = 2
if a > 1 :
  def info ():
    print 'haha'
else :
  def test ():
    print 'test'
g = lambda x : x+2
info = [g(x) for x in range(10)]
print info

このためlambdaはPython文法でdefが許されない場所に現れる.たとえば、リスト定数または関数呼び出しのパラメータです.さらに、式としてlambdaは変数名に選択的に割り当てることができる値(新しい関数)を返します.逆にdef文は、結果として返すのではなく、ヘッダに新しい関数を変数名に割り当てる必要があります.
3、内部には1行のコードしか含まれない
Lambda式:「後に、式は1つしかありません.defは複数あります.lambda式には1行のコードしか含まれません.ネーミング関数には制限はありません.lambdaの本体は1つのコードブロックではなく単一の式です.このlambdaの本体は、def本体のreturn文に置かれているコードのように簡単です.簡単に結果をスムーズに書きますを選択します.式に限られるため、lambdaは通常def機能よりも小さい:lambda本体に限られた論理をカプセル化することができ、ifのような文も使用できない.これは意図的に設計されています.プログラムのネストを制限しています.lambdaは簡単な関数を記述するために設計され、defはより大きなタスクを処理するために使用されます.
4、結果を自動的に返す
Lambda式の最後の式の値を返します.
5、lambdaはpythonリストまたはpython辞書のメンバーとして直接使用できます.
6、入れ子問題
ifやforやprintなどの文はlambdaでは使用できませんが、defは使用できます. 
defは文なので、式ではなくネストできません.lambda式は「:」の後に式が1つしかありません.すなわちdefではreturnで返すこともlambdaの後ろに置くこともでき,returnで返すこともpython lambdaの後ろに定義することもできない.したがって、ifやforやprintのような文はlambdaでは使用できません.lambdaは一般的に簡単な関数を定義するためにのみ使用されます.
7、目的が違う
Lambdaは一般的に簡単な関数を定義するために使用され、defは複雑な関数を定義することができる. 
8、再利用不可
Lambda関数は他のプログラム呼び出しに共有できません.defはできます.   
三、lambdaを使うメリットとデメリット
Lambda式は非常に簡潔なコードを書くことができるが,理解しにくく,可読性と性能を低下させるという欠点も明らかである.特にPython初心者には.
メリット:
1、単行関数の場合、lambdaを使用すると、関数を定義するプロセスを省くことができ、コードをより簡素化することができます.2、複数回呼び出されない関数の場合、lambda式は即得で、性能を向上させる.注意:for..in..if(pythonのもう一つの簡単な式)できることは、lambdaを選択しないほうがいいです.
3、Pythonを使用して実行スクリプトを書く場合、lambdaを使用すると関数を定義する過程を省くことができ、コードをより簡素化することができます.
4、抽象的で、他の場所で再多重化されない関数については、関数に名前を付けるのも難題であり、lambdaを使用するには名前の問題を考慮する必要はありません.
5、lambdaを使用すると、コードが理解しやすくなります.
6、コードは簡潔で、追加の変数を追加しません.
欠点:
1、多くのPythonプログラマーにとって、lambda式は奇妙で見慣れない文法です.
2、lambda関数自体に名前とドキュメントが欠けていることは、それらの機能を理解する唯一の方法はコードを読むことであり、コードをより難解にすることを意味します.
3、lambda式には1つの文しか含まれていないため、メタグループのパケット解除など、可読性を向上させる言語機能があり、一緒に使用できません.
4、lambda関数は通常、標準ライブラリにすでに存在する関数またはPythonに内蔵されている関数に置き換えることができ、既存の関数を利用するのがより良い.
四、lambdaの使用上の注意
1、lambda関数は、任意の複数のパラメータ(オプションパラメータを含む)を受信し、単一の式の値を返すことができる. 
2、lambda関数にはコマンドは含まれません.式は1つを超えてはいけません.
3、print文でもlambda形式では使用できません.式しか使用できません.また匿名関数にはifやforなどの条件判断,ループの文は現れない.
4、lambda式が返す関数は、この式の値を直接返します.returnがなければ、最後の式の値は値を返します.
5、匿名関数(lambda式)は、1行にしか書けないので、単行関数と呼ぶ人もいます.
6、lambdaで定義されています.
7、パラメータリストに括弧は必要ありません.
8、コロンは新しいブロックを開始するためのものではありません.
9、lambdaは匿名関数を定義した
10、lambdaはプログラムの実行効率の向上をもたらすのではなく、コードをより簡潔にするだけです.
11、forが使えるなら...in...ifが完成したのは、lambdaを絶対に使わない.
12、lambdaを使用する場合、lambda内にループを含まないでください.もしあれば、私はむしろ関数を定義して完成し、コードを再利用性とより良い可読性を得ることができます.
13、defではreturnで返すこともlambdaの後ろに置くこともでき、returnで返すこともpython lambdaの後ろに定義することもできない.したがって、ifやforやprintのような文はlambdaでは使用できません.lambdaは一般的に簡単な関数を定義するためにのみ使用されます.
14、lambda関数は独自のネーミングスペースを持ち、独自のパラメータリスト以外またはグローバルネーミングスペース内のパラメータにアクセスできません.
15、lambda関数は1行しか書けないように見えますが、CまたはC++のインライン関数とは等しくありません.後者の目的は、小さな関数を呼び出すときにスタックメモリを消費せずに実行効率を向上させることです.
16.可読性の観点から、ネストされたlambdaの使用は避けるべきである.
(1)ダイレクトコール
>>> (lambda x: x + 3)(3)               ,           
6
            ,            ,               ,      (lambda x: x + 3)
          ,         (3)

(2)一般関数でサポートされるパラメータの変化,匿名関数でサポートされる.
たとえば、デフォルトのパラメータなど:
    
>>> (lambda x,y=3: x+y)(5)
8

 
五、lambda使用シーン
(1)、lambdaは、使用するコード内に関数の定義を埋め込むことを可能にする関数のスケッチの役割を果たす.彼らは完全にオプションです(defを使用して代替することができます).しかし、実行可能なコードを埋め込むだけで、より簡潔なコード構造をもたらします.
(2)、あなたがする操作は重要ではありません:関数は名前に値しません.
(3)、lambda式を使用すると、あなたが考えている関数名よりもコードが理解しやすくなります.
(4)、あなたはまだ既存の関数があなたのニーズを満たすことができないことを確信しています.
(5)map,pcapなどの関数内で関数パラメータを必要とするシーンに特に適している.
(6)、最も重要なのは、あなたのチームの誰もがlambda式を理解し、使用することに同意していることです.Javaなど多くの言語では、C#にはlambda式の機能があります.