Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
lambda / 無名関数
『lambda』は名前を持たない無名関数を1行で定義するキーワードです。sorted()のkeyパラメータやmap()・filter()の第一引数など、関数オブジェクトを引数に渡す場面でよく使われます。lambdaは式(expression)のみを書けるので、複数の文(statement)が必要な処理には通常のdefを使います。
構文
# lambda式の基本構文 func = lambda 引数1, 引数2: 式 # sorted()のkeyに使う sorted(iterable, key=lambda x: x.属性) # map()・filter()に使う list(map(lambda x: 変換式, iterable)) list(filter(lambda x: 条件式, iterable))
関数・用途一覧
| 関数・用途 | 概要 |
|---|---|
| lambda 引数: 式 | 名前を持たない無名関数を定義する。 |
| sorted(iter, key=lambda) | lambdaでソートのキーを指定する。 |
| sorted(iter, key=lambda, reverse=True) | 降順ソート。 |
| map(lambda, iterable) | 各要素にlambdaを適用したイテレータを返す。 |
| filter(lambda, iterable) | lambdaがTrueの要素だけを返すイテレータを返す。 |
サンプルコード
# lambda: 基本的な無名関数
square = lambda x: x ** 2
add = lambda a, b: a + b
print(square(5)) # 25
print(add(3, 4)) # 7
# sorted: lambdaでソートキーを指定
fruits = ['banana', 'apple', 'cherry', 'date']
sorted_by_length = sorted(fruits, key=lambda s: len(s))
print(sorted_by_length) # ['date', 'apple', 'banana', 'cherry']
# sorted: 辞書のリストをソート
people = [
{'name': '田中', 'age': 30},
{'name': '鈴木', 'age': 25},
{'name': '山田', 'age': 35},
]
sorted_people = sorted(people, key=lambda p: p['age'])
print([p['name'] for p in sorted_people]) # ['鈴木', '田中', '山田']
# sorted: 複数キーでソート(タプルを返す)
data = [('田中', 30), ('鈴木', 25), ('山田', 30), ('伊藤', 25)]
# 年齢の昇順 → 名前の昇順
sorted_data = sorted(data, key=lambda x: (x[1], x[0]))
print(sorted_data)
# [('伊藤', 25), ('鈴木', 25), ('田中', 30), ('山田', 30)]
# map: 各要素を変換
nums = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, nums))
print(squares) # [1, 4, 9, 16, 25]
# ※ リスト内包表記の方がPythonicな場面が多い
squares2 = [x ** 2 for x in nums]
# filter: 条件を満たす要素のみ取得
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
# filter + map の組み合わせ
result = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, nums)))
print(result) # [4, 16](偶数の二乗)
# ※ 内包表記でも書ける
result2 = [x ** 2 for x in nums if x % 2 == 0]
概要
『lambda』はdefで通常の関数を定義するのと本質的に同じですが、1行で書けるため引数として渡す場面に向いています。ただし処理が複雑な場合やデバッグが必要な場合は、defで名前付き関数として定義する方が可読性が高くなります。
map()・filter()とlambdaの組み合わせはPythonで昔からよく使われてきたパターンですが、現代的なPythonではリスト内包表記やジェネレータ式の方がより可読性が高いとされており、Pythonスタイルガイド(PEP 8)でも内包表記が推奨されています。lambdaはsorted()のkeyパラメータなど、内包表記では代替できない場面で使いましょう。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。