【Python必須テクニック】lambda式(匿名関数)とその内蔵関数への応用


Lambda式は、匿名関数とも呼ばれる.すなわち、関数には具体的な名前がなく、内部に1行の式しか含まれていない関数を表すのによく使われる.
Lambdaで記述されたコードはより簡潔でコンパクトであるが,lambda関数がサポートする機能は非常に限られており,現在PEP 8はlambdaではなくdefで関数を定義することを推奨しているが,それでもPythonプログラマーとして匿名関数を認識し理解する必要がある.
  • lambdaはただの式で、関数体はdefよりずっと簡単です.
  • lambdaのボディは、コードブロックではなく式です.限られた論理をlambda式にカプセル化できるだけです.
  • lambda関数は、独自のネーミングスペースを持ち、独自のパラメータリストまたはグローバルネーミングスペースのパラメータにアクセスできません.
  • lambda関数は1行しか書けないように見えますが、CまたはC++のインライン関数とは等しくありません.後者の目的は、小さな関数を呼び出すときにスタックメモリを消費せずに実行効率を向上させることです.

  • Lambdaの構文:lambda argument(s):expressionLambda関数には多くのパラメータがありますが、式は1つしかありません.Lambdaオペレータは、任意の変数に値を割り当てることができる関数オブジェクトを返す宣言はできません.
    Lambda関数の簡単な例:
    lambda x, y: x * y     #       x   y,        x*y
    
    lambda:None     #         ,    None
    
    >>> a = lambda x: x+1
    >>> a(1)
    2
    
    #   def       :
    
    >>> def a(x):
    		return x+1
    >>> a(1)
    2
    

    Lambda関数とdefの主な相違点:
  • lambdaはすぐに(変数を必要としない)、自動的に結果を返すことができます.
  • lambdaは内部に1行のコードしか含まれていない.
  • lambdaは簡単な関数を記述するために設計され、defはより大きなタスクを処理するために使用される.
  • lambdaは匿名関数を定義することができ、defが定義した関数には名前が必要です.

  • Lambda関数の利点:
  • 単行関数の場合、lambda式を使用すると、関数を定義するプロセスを省くことができ、コードをより簡潔にすることができます.
  • 複数回の多重化を必要としない関数については、lambda式を使用すると、使い終わった直後に解放され、プログラム実行のパフォーマンスが向上します.

  • Lambda関数は、いくつかの組み込み関数でよく使用されます.map()関数:シーケンスを巡回し、シーケンス内の各要素を操作します.lambda関数は、リスト内の各要素に対する共通の操作条件を指定するために使用されます.
    >>> list1 = [1, 2, 3, 4]
    >>> list2 = [5, 6, 7 ,8]
    >>> list3 = map(lambda a, b: a + b, list1, list2)     #              
    >>> print(list3)
    <map object at 0x000001EA57C07780>
    >>> print(list(list3))
    [6, 8, 10, 12]
    
    filter()関数:シーケンス内の要素をフィルタ処理し、lambda関数はリスト要素をフィルタする条件を指定します.
    >>> list1 = [1, 2, 3, 4]
    >>> list2 = filter(lambda a: a > 2, list1)     #          2    
    >>> print(list2)
    <filter object at 0x000001EA57C07898>
    >>> print(list(list2))
    [3, 4]
    
    reduce()関数:シーケンス内のすべての要素に対して累積操作を行い、lambda関数はリスト内の2つの隣接する要素の累積条件を指定するために使用されます.
    >>> from functools import reduce
    >>> list1 = [1, 2, 3, 4]
    >>> list2 = reduce(lambda a, b: a + b, list1)     #             
    >>> print(list2)
    10
    >>> list2 = reduce(lambda a, b: a * b, list1)     #             
    >>> print(list2)
    24
    
    sorted()関数:シーケンス内の要素をソートします.lambda関数は、リスト内のすべての要素をソートする条件を指定します.
    >>> list1 = [1, 2, 3, 4, 5, 6, 7, 8]
    >>> list2 = sorted(list1, key = lambda a: abs(4-a))     #          4            
    >>> print(list2)
    [4, 3, 5, 2, 6, 1, 7, 8]
    

    その他の資料:《Pythonの中でlambdaの表現式を編纂しないでください、みんながそれを使うことを提案しません》