1. lambda式とは¶
lambda
式とは、名前がついていない関数(無名関数)を表現する記法のひとつである。
ちなみに関数とは,
len()
, range()
, int()
, float()
,
str()
, print()
, open()
などのことである。
python入門8章でも、 def
という形を用いて関数を定義した。
その例が以下である。
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式を使って上の関数を記述すると、
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
で作成した関数は、戻り値を変数に代入しない限りは無名の関数のままであるということが def
と lambda
式との主な違いである。