コンテンツにスキップ

ラムダ式

ラムダ式とは関数を変数に代入して扱えるようにするものです。ラムダ式が必要になってくるシーンは関数を別の関数の引数として渡す必要があるときです。

Tips

引数として渡される関数のことをコールバックといいます。

例として map() という組み込み関数について考えてみます。map() はリストなどのコレクションの各要素に何らかの変換を加えたコレクションを新たに作成する関数です。

a = [1, 2, 3, 4, 5]

上記のリストの各要素を 2 乗して [1, 4, 9, 16, 25] というリストを map() で作成するには次のようにします。

list(map(lambda x: x * x, a))

map() の第 1 引数にはラムダ式が渡されています。ラムダ式は機能的には通常の関数と同様の機能を提供しており

lambda x: x * x

というラムダ式は下記の関数と等価なものになっています。

def power(x):
    return x * x

map() は第 2 引数に渡されたコレクションの各要素をラムダ式に渡し、その戻り値を逐次返却していくという振る舞いをします。ちなみに map() には上記の power() のような通常の関数を渡すこともできます。

list(map(power, a))

ラムダ式が通常の関数と異なる点は

  • 名前を持たない(無名関数)
  • 必要なときに即時に定義できる

という点です。map() に渡すためのちょっとした処理に対して、わざわざ関数定義をするのも面倒だといったケースではラムダ式が使われます。その他の例もいくつか挙げておきます。

list(map(lambda x: 2 * x, a))           # [2, 4, 6, 8, 10]
list(map(lambda x: (x, 2 * x + 1), a))  # [(1, 3), (2, 5), (3, 7), (4, 9), (5, 11)]

map() の戻り値は ジェネレータ というオブジェクトが返ります。ジェネレータ自体はリストではないですが、ループ文に渡すことでリストと同じように変換結果の要素を取り出すことができます。

for item in map(lambda x: x * x, a):
    print(item)     # 1, 4, 9, 16, 25

ジェネレータを list() に渡すとリストに変換してくれますが、ループ文で要素を参照するだけであればリストに変換する必要はありません。インデックス参照などがしたい場合にリストに変換すると良いでしょう。map() のようにコレクションとコールバックを受け取りジェネレータを返す関数は他にもいくつか用意されています。代表的なものには itertools があります。