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