================ lambda式とは ================ ``lambda`` 式とは、名前がついていない関数(無名関数)を表現する記法のひとつである。 ちなみに関数とは, :py:func:`len` , :py:func:`range` , :py:func:`int` , :py:func:`float` , :py:func:`str`, :py:func:`print` , :py:func:`open` などのことである。 python入門8章でも、 ``def`` という形を用いて関数を定義した。 その例が以下である。 .. literalinclude:: func.py :linenos: :emphasize-lines: 8-12 :caption: func.py ``func.py`` を実行した結果が以下である。 .. code-block:: bash $ python func1.py sqradd(1,2): 5 これに対し、lambda式を使って上の関数を記述すると、 .. literalinclude:: lamb.py :linenos: :emphasize-lines: 8 :caption: lamb.py 実行結果は以下である。 .. code-block:: bash $ python lamb.py f = 5 2つを比較すると、defによる記法では関数の定義に5行必要なのに対し、lambda式では1行で終了していることがわかる。 lambda式の構造を詳しく説明すると、 .. code-block:: python lambda a,b: a*a + b*b まず、lambdaは「今からlambda式を書く」と処理系に教えるキーワード(予約語)である。defと同じ。 lambdaの横にあるa,bは引数を表しており、 .. code-block:: python def sqradd(a,b): の( )の中と同じ意味を示している。 次に、: を挟んで右側が返り値を表している。 .. code-block:: python a=a*a b=b*b c=a+b return c と同じ意味である。 実行例では、 .. code-block:: python (lambda a,b: a*a + b*b)(1,2) とすることで引数に(1,2)を代入して計算を行っている。 また、 .. code-block:: python f=(lambda a,b: a*a + b*b)(1,2) とすることで、fに計算結果である5を代入している。 lambda式とdefの違い -------------------- ここまで述べた ``lambda`` 式の説明では、 ``def`` を使った関数定義と何が違うのかがよくわからないと思う。defと ``lambda`` では本質的に何が違うのかというと、 ``lambda`` 式はあくまでも「式」であり、 ``def`` はステートメントである。よって  :program:`python` の文法上 ``def`` による関数定義が使えない箇所でも ``lambda`` によって処理をまとめることが出来る。 ``def`` による関数定義では、関数オブジェクトが関数名に自動的に代入されるので、 ``def`` では定義の際に関数名をつけるので、呼び出し側からはこの名前を利用すればよい。 上記の ``lambda`` 式の ``a*a + b*b`` は、戻り値としてこの ``a*a + b*b`` という"無名”の関数オブジェクトを返すことを意味している。 ``lambda`` で作成した関数は、戻り値を変数に代入しない限りは無名の関数のままであるということが ``def`` と ``lambda`` 式との主な違いである。