Pythonでラムダ式の使い方をまとめました
※ラムダ式は英語で"lambda"と表記されますが、AWSのLambdaとは異なります
Pythonのラムダ式は無名関数で、通常はdefで関数名を定義しますが
ラムダ式は引数と式などで構成されます
具体的にコードの違いを見てみましょう
defの場合
def add_function(x, y):
return x + y
ラムダ式の場合
add_value = lambda x, y: x + y
メリット
-
シンプル
1行で処理が記載できるので簡潔にコードを書けます
filter()などの高階関数(関数を引数として受け取る関数)と組み合わせるとよりコードが短く書けます -
関数(メソッド)が減らせる
先ほど示したようにdefで定義してメソッド化する手間が減ります
高階関数を使用したラムダ式
- filter
配列の数字の中から偶数の数字を抽出する処理
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
even_list = list(even_numbers)
print(even_list)
# 出力: [2, 4, 6, 8, 10]
- map
配列の数字にプラス1する処理
numbers = [1, 2, 3, 4, 5]
add_numbers = map(lambda x: x + 1, numbers)
add_list = list(add_numbers)
print(add_list)
# 出力: [2, 3, 4, 5, 6]
- reduce
配列の数字を全て掛け算する処理
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)
# 出力: 120
ラムダ式の使い方
冒頭で述べた通りラムダ式は無名関数のため、変数や式を用いて関数を作成できます
例を示すと
add_number = lambda x, y : x + y
print(add_number(4, 6))
# 出力: 10
2つの変数を足す関数を定義しておきます
add_numberが呼ばれると2つの引数を足し合わせる処理が実行されます
このように任意に引数を設定する場合は、引数の順番が大事で順序を入れ替えることはできません。
順序を入れ替えたい場合はどのようにしたら良いでしょうか?
POSシステムのような決済システムでの1例で売値や割引率、消費税を考慮して販売価格を計算する処理を作成してみました
discounted_price = lambda price, discount = 0.1, vat = 0.02 : price * (1 - discount) * (1 + vat)
print(discounted_price(1000, vat=0.04, discount=0.3))
# 出力: 728.0
vat=0.04, discount=0.3、このようにキーワード引数とすることで
ラムダ式の中にdiscount = 0.1, vat = 0.02を定義していますが引数の値で上書きして計算することができます
ラムダ式では、price→discount→vatの順で値が定義されていますが
2行目のdiscounted_priceを呼び出している時は、price→vat→discountの順で設定していますが、想定通りに処理されています
for文(リスト内包表記)
numbers = [1, 2, 3, 4, 5]
add_numbers = [(lambda x: x + 2)(num) for num in numbers]
print(add_numbers)
# 出力: [2, 4, 6, 8, 10]
ラムダ式の中でfor文を使用した例です
リスト内包表記をラムダに組み込むことは可能です
人によっては可読性が落ちるため、ラムダの処理とfor文の処理は分けて書いた方が保守しやすいかもしれません
三項式
calc = lambda x, y, is_add: x + y if is_add else x - y
result = calc(10, 5, True)
print(result)
# 出力: 15
三項式もラムダ式で使用できます
三項式の条件が複雑な場合は処理を分けて書いた方が可読性が高まります
まとめ
ラムダ式を使用するとコードを簡潔に短く書くことができ、Pythonの特徴のシンプルさを体現できます
また、後半のように可読性は問題となってくるためチームの状況に応じて使用することが推奨されます
ラムダ式と相性が良いのはfilter関数のような高階関数だと思います
自分は高階関数はラムダ式で使いますが、三項式やfor文は分けて書いています
備考
Python公式のラムダ式についてコチラ
Python公式のスタイルガイド
コードの可読性について参考になります