Python: ラムダ式(無名関数)の書き方と使い方

ラムダ(lambda)式とは無名関数を書くための記法のことです。
ラムダ式は map()や list()など他の処理と組み合わせて使うことが多いので、 一見複雑そうに見えます。
最初は「何これ?」と思うかもしれませんが、 一つずつ紐解いていけば必ず理解できます。

ラムダ(lambda)式の書き方

lambda式を書くにあたっては、「lambda」キーワードと「引数」、 「処理」が必要となります。 引数と処理をコロン「:」で区切り、引数が複数ある場合は引数をカンマ「,」で区切ります。

書式
# 引数が1つの場合
lambda 引数: 処理

# 引数が複数の場合
lambda 引数1, 引数2, ...: 処理

具体的には次のように書きます。

# 引数(数値)を1つ受け取り、その数に1を足して返す
lambda n: n + 1

# 引数(数値)を2つ受け取り、2つを足した数を返す
lambda a, b: a + b

簡単な例として、 引数(数値)を1つ受け取り、 その数を2倍にして返す関数を作ってみます。

まずは普通の関数を作ります。

def double(n):
	return n * 2

print(double(3))  # 6

次はラムダ式で無名関数を作り、 無名関数を変数に代入してみます。

double = lambda n: n * 2

print(double(3)) # 6

通常の関数を使う方法でも、ラムダ式(無名関数)を使う方法でも、 どちらも同じ結果を得ることができます。

ラムダ式を使うのは、 わざわざ通常の関数を作るまでもない場合です。
では次にどのような場面でラムダ式を使うのかを説明します。

ラムダ(lambda)式の使い方

ラムダ(lambda)式をよく使うのは、「map()関数の引数として」です。
map()関数はリストやタプルなどの要素を順番に、 指定された処理を行い新しいオブジェクトを作ります。

map()関数の書式は次の通りです。

書式
map(関数, イテラブルなオブジェクト)

第1引数の「関数」の部分にラムダ式をよく使います。
第2引数の「イテラブルなオブジェクト」とはリストなどの 繰り返し処理が可能なオブジェクトのことです。 よく使われるのはリストです。

では具体例として、リストの各要素を2倍にする処理を記述してみます。 通常の関数を使う場合と、 ラムダ式(無名関数)を使う場合の2通りで記述します。

通常の関数を使う場合

まずは通常の関数を使った方法です。 赤字の部分で通常の関数「double」を指定しています。

def double(n):
	return n * 2

li = [1, 2, 3]

new_li = list(map(double, li))

print(new_li) # [2, 4, 6]

map()関数の戻り値はイテラブルな mapオブジェクトです。 mapオブジェクトをリストに変換するには listコンストラクタに 渡す必要があります。それが下の部分です。

list(map(関数, リスト))

ラムダ式(無名関数)を使う場合

次にラムダ式を使って記述します。 先ほど通常の関数を指定した部分にラムダ式を記述します。

li = [1, 2, 3]

new_li = list(map(lambda n: n * 2, li))

print(new_li) # [2, 4, 6]

このように、ラムダ式はmap()関数の引数として使われるケースが良くあります。

最後に ラムダ式は必要か?

ラムダ式を使ったソースコードは、 いろいろと組み合わせているので複雑そうに見えますが、 ひとつずつ紐解いていけば理解できます。

実際に自分でPythonのコードを書く場合、 無理にラムダ式を使う必要はありません。 無名関数ではなく通常の関数を使っても大丈夫です。 ただし、他人のコードを読み解く場合はラムダ式の知識が必要となるため 知っておいた方が良いでしょう。

Python