1. lambda式とは

lambda 式とは、名前がついていない関数(無名関数)を表現する記法のひとつである。

ちなみに関数とは, len() , range() , int() , float() , str(), print() , open() などのことである。

python入門8章でも、 def という形を用いて関数を定義した。

その例が以下である。

func.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 16 13:10:26 2018

@author: user
"""

def sqradd(a,b):
    a=a*a
    b=b*b
    c=a+b
    return c
    
print "sqradd(1,2): ",sqradd(1,2)

func.py を実行した結果が以下である。

$ python func1.py
sqradd(1,2):  5

これに対し、lambda式を使って上の関数を記述すると、

lamb.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# -*- coding: utf-8 -*-
"""
Created on Tue May 29 13:58:41 2018

@author: user
"""

f=(lambda a,b: a*a + b*b ) (1,2)

print "f =",f

実行結果は以下である。

$ python lamb.py
f = 5

2つを比較すると、defによる記法では関数の定義に5行必要なのに対し、lambda式では1行で終了していることがわかる。

lambda式の構造を詳しく説明すると、

lambda a,b: a*a + b*b

まず、lambdaは「今からlambda式を書く」と処理系に教えるキーワード(予約語)である。defと同じ。

lambdaの横にあるa,bは引数を表しており、

def sqradd(a,b):

の( )の中と同じ意味を示している。

次に、: を挟んで右側が返り値を表している。

a=a*a
b=b*b
c=a+b
return c

と同じ意味である。

実行例では、

(lambda a,b: a*a + b*b)(1,2)

とすることで引数に(1,2)を代入して計算を行っている。

また、

f=(lambda a,b: a*a + b*b)(1,2)

とすることで、fに計算結果である5を代入している。

1.1. lambda式とdefの違い

ここまで述べた lambda 式の説明では、 def を使った関数定義と何が違うのかがよくわからないと思う。defと lambda では本質的に何が違うのかというと、 lambda 式はあくまでも「式」であり、 def はステートメントである。よって  python の文法上 def による関数定義が使えない箇所でも lambda によって処理をまとめることが出来る。

def による関数定義では、関数オブジェクトが関数名に自動的に代入されるので、 def では定義の際に関数名をつけるので、呼び出し側からはこの名前を利用すればよい。

上記の lambda 式の a*a + b*b は、戻り値としてこの a*a + b*b という"無名”の関数オブジェクトを返すことを意味している。 lambda で作成した関数は、戻り値を変数に代入しない限りは無名の関数のままであるということが deflambda 式との主な違いである。