0
1

More than 1 year has passed since last update.

Pythonでラムダ式を使う

Posted at

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公式のスタイルガイド

コードの可読性について参考になります

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1