Python ラムダ式
関数を変数に代入して使う
ラムダ式の話の前に「関数を変数に代入して使う」ことについて説明する。
次のように、関数は変数に代入できる。
変数に代入された関数を使用するときは、普通に関数を使用するのと同様にすればよい。
# 関数の定義:引数無し・戻り値無し def hello(): print("hello world") # 関数の定義:引数有り・戻り値有り def sum(x, y): return x+y funcA = hello # 変数funcAに、関数helloを代入 funcA() # 変数funcAに代入された関数を呼び出す。 # hello world と出力される。 funcA = sum # 変数funcAに、関数sumを代入 a = funcA(3,4) # 変数funcAに代入された関数を呼び出す。 print(a) # 7 と出力される。
ラムダ式と、等価なdef文の関数
ラムダ式の文法は次の通り。
lambda 引数, 引数, ... : 式
上記のラムダ式は、次のdef文による関数と同等。
def 関数名(引数, 引数, ...): return 式
具体例は、次の通り。
# 変数funcAに、ラムダ式による関数を代入 funcA = lambda x, y: x+y a = funcA(3,4) print(a) # 7 と出力される # 関数の定義 def sum(x, y): return x+y a = sum(3,4) print(a) # 7 と出力される
ラムダ式の引数は、デフォルト引数・キーワード引数・可変長引数も使用可能である。
ラムダ式の式の部分として、複数行になる文は使用できない。
ラムダ式の使いどころ
関数の引数に関数を指定する場合に、ラムダ式を使うと簡潔にコードを記述できる。
def文による関数では事前に関数定義が必要になるが、ラムダ式ではこれが不要な分だけ簡潔になる。
リスト型のメソッドsort()や、組み込み関数sorted(), max(), min()の引数keyは、
ちょうどこのケースに相当する。具体例を次に示す。
# 関数定義:3文字目を取得 def get3mojime(x): return x[2] listF = ["Tokyo", "Nagoya", "Osaka"] listF.sort(key=get3mojime) # keyに関数を指定 print(listF) # ['Osaka', 'Nagoya', 'Tokyo']
上記は、ラムダ式を使うと下記のように簡潔に記述できる。
listF = ["Tokyo", "Nagoya", "Osaka"] listF.sort(key=lambda x: x[2]) # keyにラムダ式を指定 print(listF) # ['Osaka', 'Nagoya', 'Tokyo']