Pythonにおける無名関数(匿名関数)の書き方について説明します。無名関数は、一度だけしか使われない使い捨ての関数のことです。一度きり使うだけなので、名前をつける必要がないため無名関数と呼ばれます。Pythonではlambda式を使って無名関数を作ることができます。
lambda式を使った無名関数の作り方
通常、関数は処理のまとまりに名前をつけて部品化したもので、名前をてがかりにプログラム中のどこからでも呼び出すことができます。しかし、プログラムの途中でその場限りで使い捨てる場合は名前を付ける必要がありません。このような関数を無名関数と呼び、最近の言語ではlambda式を使って記述することが多くなっています。
次の例は2つの引数を足し算した結果を返す関数add()を定義したプログラムです。
1 2 |
def add(x, y): return x + y |
この関数にはaddという名前がつけられているので、次のように呼び出して使うことができます。
1 |
print add(3, 4) # 7 |
しかし、上記のような簡単な処理を行う関数であれば、わざわざ関数として定義せずに一度きりの使い捨て関数として次のように記述することができます。lambdaを使うことにより、defで関数定義を行う必要がなくなり簡潔に記述できます。
1 2 |
num = (lambda x,y:x + y)(3,4) print num # 7 |
lambda式を使って無名関数を作る書式は次のようになります。
1 |
lambda 引数:返り値 |
lambda式を他の関数と組み合わせて使う
上記の例ではまだ無名関数のメリットがわかりにくいかもしれません。lambdaは式なので、defと異なり関数をプログラムの様々なところで作ることができます。具体的には、他の関数と組み合わせて使う際に効力を発揮します。map()と組み合わせた例を見てみましょう。
次はdefを使って定義した関数pow()をmap()によってリストに適用したプログラムです。
1 2 3 4 5 6 |
# 引数を2乗するpow()の定義 def pow(x): return x * x # map()でリストの各要素にpow()を適用 print map(pow, [2,3,4]) # [4, 9, 16] |
ここでは、まず引数を2乗した値を返す関数pow()を定義しています。次に、map()を使ってpow()を[2,3,4]というリストの各要素に適用した結果を表示しています。これは、lambdaを使った無名関数を使い次のように書くことができます。
1 |
print map(lambda x:x * x, [2,3,4]) # [4, 9, 16] |
map()は、map(関数、リスト)という書式をとり、第1引数で指定した関数の処理を第2引数で指定したリストの各要素に対して順番に適用していきます。
もし引数を2乗する処理を再利用する場合は名前をつけて関数定義する必要がありますが、この場限りの使い捨ての関数ということであれば、lambda式を使うことで簡潔に記述することができます。