この記事では、Pythonのラムダ式(lambda)の使い方を解説します。
ラムダ式を使うことで簡単な関数のような処理を式として1行で表現することができます。ラムダは、関数オブジェクトが要求される箇所に使用可能です。
引数に関数の参照を取る関数(高階関数)と組み合わせてよく使用されます。
それでは、ラムダ式の使い方を見ていきましょう!
ラムダ式とは?
ラムダ式とは、単純な処理を関数を使わずに式として表現できる機能で、関数オブジェクトを要求する箇所に指定することができます。
- 名前のない簡単な関数を生成できる
- 関数オブジェクトを要求する場所ならどこでも使える
- 単一の式のみ使える
ラムダ式は 「匿名関数」や「無名関数」とも呼ばれています。
ラムダ式の使い方
ラムダ式は、lambda
キーワードを使って定義します。
lambda 式
例えば、以下のような関数があったとして...
def func():
return 1 + 2
この関数と同じ処理をラムダ式で実装すると以下のようになります。
lambda: 1 + 2
実際に関数とラムダ式を呼び出して結果を比較してみます。
# 関数
def func():
return 1 + 2
print(func()) # 3
# ラムダ式
lam = lambda: 1 + 2
print(lam()) # 3
ラムダ式は変数に代入しなくても直接実行することもできます。その際は、優先順位の問題を解決するために()
を使います。
print((lambda: 1 + 2)()) # 3
引数の定義
ラムダ式には、引数を定義することもできます。
lambda 引数名1, 引数名2: 式
通常の関数と同様にデフォルト値を指定することもできます。
lambda 引数名 = デフォルト値: 式
lambda 引数名1 = デフォルト値, 引数名2 = デフォルト値: 式
lambda 引数名1, 引数名2 = デフォルト値: 式
例えば、以下のような関数があったとして...
def func(a, b):
return a + b
この関数と同じ処理をラムダ式で実装すると以下のようになります。
lambda a, b: a + b
実際に関数とラムダ式を呼び出して結果を比較してみます。
# 関数
def func(a, b):
return a + b
print(func(1, 2)) # 3
# ラムダ式
lam = lambda a, b: a + b
print(lam(1, 2)) # 3
高階関数にラムダ式を使う
ラムダ式は、高階関数と組み合わせてよく使われます。
引数に渡された値が0
以上ならば何かしらの処理を実行する関数があったとします。
def func(num):
if num >= 0:
print('実行')
しかし、状況によって条件を変更したいなと思った時に、関数の参照を引数にとってやることで呼び出し時に条件を変更することができます。
def func(f, num):
if f(num):
print('実行')
このように、関数の参照を引数で受け取ったり、戻り値として返したりする関数のことを「高階関数」と呼びます。
高階関数を使用する際にラムダ式を使うことでめちゃんこ便利です。例えば、先ほどのfunc()
関数を呼び出す際にラムダ式を使うことで無駄な関数を定義しなくて済む。
func(lambda a: a > 5, 6)
高階関数とラムダ式はよく組み合わせて使用されます。高階関数の使い方は以下の記事で紹介しているので気になる方は参照してください。
ラムダ式の注意点
とても便利なラムダ式ですが、注意点が1つだけあります。
ラムダ式内でグローバルな値を使用している場合、式を定義した時の値ではなく、実行するときの値が参照されて評価されます。
例えば、以下のコードを見てください。lam
変数にラムダ式を代入した際、num
変数の値は1
だったので実行結果は2
を返すような気がしますが、lam
を実行する前にnum
が2
に書き換えられているので4
を返してしまいます。
num = 1
lam = lambda: num * 2
num = 2
print(lam())
実行結果
4
この問題を避けるにはグローバルな値をラムダ式内のローカルな変数に保存しておきます。
num = 1
# n = numでローカルに保存
lam = lambda n = num: n * 2
num = 2
print(lam()) # 2
まとめ
この記事では、Pythonのラムダ式について解説しました。
ラムダ式を使うと複数回使わない単純な処理の関数を定義しなくて済みます。また、高階関数と組み合わせることで非常に便利な処理を実装することができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ