Pythonには、def キーワードを使って関数を定義するほかに、lambda(ラムダ)式を使って「名前を持たない関数(無名関数)」を作成する方法があります。
lambda 式を使うと、非常に短い関数をわざわざ定義することなく、その場で一行で記述できるため、コードが簡潔になります。特に、他の関数(高階関数)の引数として処理を渡す場合に重宝します。
この記事では、lambda 式の基本的な書き方と、map() や sorted() と組み合わせた実用的な使い方について解説します。
lambda 式の基本構文
lambda 式は、以下のような構文で記述します。
構文:
lambda 引数: 返り値となる式
def 文による関数定義と比較してみましょう。例として、受け取った数値を2乗して返す関数を考えます。
通常の関数定義 (def)
def square_def(x):
return x ** 2
print(f"def: {square_def(5)}")
lambda 式による定義
# x を受け取り、x ** 2 を返す関数を作成し、変数 square_lambda に代入
square_lambda = lambda x: x ** 2
print(f"lambda: {square_lambda(5)}")
実行結果:
def: 25
lambda: 25
return 文を書く必要がなく、式の結果が自動的に戻り値となります。このように、単純な計算や処理であれば、lambda を使うことで非常に短く記述できます。
高階関数との併用
lambda 式が真価を発揮するのは、関数を引数として受け取る「高階関数」と一緒に使う場合です。わざわざ def で名前付き関数を作るまでもない「使い捨ての処理」を渡すのに適しています。
1. map() 関数での利用
map() は、リストなどの全要素に対して、指定した関数を適用する組み込み関数です。
例として、数値のリストを「金額(文字列)」に変換する処理を行います。
price_list = [1000, 2500, 500, 12000]
# リストの各要素 x に対して、f"{x:,}円" という書式適用を行う
# mapオブジェクトを list() でリストに変換して表示
formatted_prices = list(map(lambda x: f"{x:,}円", price_list))
print(formatted_prices)
実行結果:
['1,000円', '2,500円', '500円', '12,000円']
2. filter() 関数での利用
filter() は、条件に一致する(結果が True になる)要素だけを抽出する関数です。
例として、数値リストから「3の倍数」だけを取り出します
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# x % 3 == 0 (3で割り切れる) 要素のみ抽出
multiples_of_three = list(filter(lambda x: x % 3 == 0, numbers))
print(multiples_of_three)
実行結果:
[3, 6, 9]
3. sorted() 関数での利用(ソートキーの指定)
最も実用的なのが、リストの並び替え(ソート)におけるキーの指定です。辞書やタプルのリストを、特定の要素を基準に並び替えたい場合に lambda が活躍します。
例として、ユーザー情報の辞書リストを「年齢」順に並び替えます。
# ユーザー情報のリスト
user_list = [
{"name": "Tanaka", "age": 45},
{"name": "Sato", "age": 30},
{"name": "Suzuki", "age": 38}
]
# age (年齢) を基準にソートする
# lambda x: x["age"] は、辞書を受け取り年齢を返す関数
sorted_users = sorted(user_list, key=lambda x: x["age"])
print(sorted_users)
実行結果:
[{'name': 'Sato', 'age': 30}, {'name': 'Suzuki', 'age': 38}, {'name': 'Tanaka', 'age': 45}]
key= 引数に lambda 式を渡すことで、「辞書そのものではなく、辞書の中の age の値を比較して並べる」という指示を簡潔に記述できました。
まとめ
lambda 引数: 式の形式で、無名関数を作成できます。returnは記述せず、式の評価結果がそのまま戻り値になります。map()、filter()、sorted()などの高階関数と組み合わせることで、コードを簡潔かつ効率的に記述できます。- 処理が複雑になり、複数行が必要になる場合は、無理に
lambdaを使わずdefで通常の関数を定義することを推奨します。
