無名関数: ラムダ式

ラムダ式(lambda)を用いて名前のない関数を書けます。名前のない関数を 無名関数 と呼びます。名前が必要ない小さな関数を作るための機能です。

lambda [引数] : [処理]

のかたちで書きます。引数と処理をコロン(:)で区切って書きます。

通常の関数:

def add(a, b):
    return a + b

c = add(1, 2)
print(c)
# 3

無名関数:

add = lambda a, b: a + b
c = add(1, 2)
print(c)
# 3

コロンの前のa, bの部分が引数、 a + bの部分が処理です。処理結果が変数addに代入されます。

ここまでの例では普通の関数との違いが分かりづらいです。 具体的にラムダ式が必要となるケースを見てみましょう。

Pythonでは関数の引数に関数を受け取ることができます。たとえばリストを並び替える sorted() 関数は並び順を指定する key 引数 に関数を受け取ることができます。

まず sorted() 関数の基本的な使い方を見てみましょう

リストの並べ替え:

sample_list = [5, 1, 2, 4, 3]
a = sorted(sample_list)
print(a)
# [1, 2, 3, 4, 5]

sorted() 関数には key という並び順を指定する引数があり、関数を受け取ることができます。 ここでlambda式の無名関数を利用します。

keyで指定された関数には、リストの1つ1つの要素が渡されます。 上記のリストを 逆順(値が大きい順) に並び替えてみましょう。

リストを逆順で並べ替え:

sample_list = [5, 1, 2, 4, 3]
a = sorted(sample_list, lambda x: -x) # <- 各要素にマイナスを付ける
print(a)
# [5, 4, 3, 2, 1]

リストの各要素の数値に、マイナス(-)を付けることで、逆順に並び替えることができました。

次に辞書を並べ替えましょう

辞書をキーで並べ替え:

sample_dict = {'a': 2, 'c': 3, 'b':1}
b = sorted(sample_dict.items())
print(b)
# [('a', 2), ('b', 1), ('c', 3)]

値で並べ替えをしたい場合もkey引数を利用します。

sample_dict = {'a': 2, 'c': 3, 'b':1}
c = sorted(sample_dict.items(), key=lambda x:x[1])
print(c)
# [('b', 1), ('a', 2), ('c', 3)]

また、リストのリストも並べ替えられます。

sample_list_list = [[2, 4, 3], [1, 1, 1], [5, 4, 2]]
d = sorted(sample_list_list, key=lambda x: x[2])
print(d)
# [[1, 1, 1], [5, 4, 2], [2, 4, 3]]

key引数にラムダ式を指定することにより、各要素のどの値をキーにするか指定できます。

まとめ

  • ラムダ式を使うと無名関数を作れます。
  • 関数を定義するまでもない小さな処理を関数化したい時に使いましょう。
  • sorted() 関数のkey引数のように、関数を受け取る引数などに使うと良いでしょう。

sorted() 関数について詳しくは、ソート HOW TOを参照ください。

ラムダ式について詳しくは、小さな関数とラムダ式を参照ください。