チャポケのブログ

勉強したことをまとめておく。

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']