lambdaの概要
| 無名関数の定義 Python予約語 | ||
|
lambda 概要 わかりやすく説明 |
||
|
lambdaの考え方をイメージで理解

lambdaの基本的な使い方
数値を2倍にする lambda 関数を定義し、それを変数に格納して通常の関数と同じように呼び出す基礎的な例です。
# lambda を使った無名関数
double = lambda x: x * 2
print(double(5)) # 結果: 10
lambda 引数: 引数を使った計算式という基本構造になっています。- コロン(
:)の右側に書いたx * 2の計算結果が、自動的に関数の外へと返されます(returnを書くと逆に構文エラーになります)。
引数を2つ持つlambda関数
通常の関数と同じように、カンマ(,)で区切ることで複数の引数を受け取ることができます。
# 2つの引数を取る lambda 関数
add = lambda a, b: a + b
print(add(3, 7)) # 結果: 10
lambdaをsorted()のキー関数として使う(超実務向け)
リストの各要素が「タプル(多次元データ)」である場合に、どの数値を基準にして並び替えるかを lambda でピンポイントに指示する最も代表的な実務の活用法です。
# 二次元データ(x座標, y座標)のリスト
points = [(2, 3), (1, 5), (4, 2)]
# y座標(インデックス1番目)を基準にして昇順ソート
sorted_points = sorted(points, key=lambda p: p[1])
print(sorted_points) # 結果: [(4, 2), (2, 3), (1, 5)]
key=lambda p: p[1]によって、sorted()は各タプルの「後ろ側の数値」だけを見て並び替えを実行してくれます。
lambdaをmap()で使う
map() 関数と組み合わせることで、リストの中にあるすべての数値を、一斉に lambda の数式に通して新しいリストへ変換させることができます。
# map() と lambda の組み合わせ
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # 結果: [1, 4, 9, 16, 25]
lambdaをfilter()で使う
filter() 関数に lambda で書いた条件式(結果が True か False になる式)を渡すことで、条件にマッチした要素だけをふるい落として抽出します。
# filter() と lambda の組み合わせ
numbers = [10, 25, 30, 45, 50]
filtered = list(filter(lambda x: x % 2 == 0, numbers))
print(filtered) # 結果: [10, 30, 50] (偶数だけを救い上げる)
lambdaの注意点
- 複雑なロジックを無理やり詰め込むとコードが崩壊する:
lambdaは 1行しか書けません。三項演算子などを使って無理やり分岐をねじ込むことも技術的には可能ですが、誰の目から見ても地獄のような読みにくさになります。処理が2行以上になる場合は、迷わず通常のdefを使った関数設計に切り替えてください。# 【悪い例】無理に複雑な分岐を詰め込んだ最悪の可読性 bad_func = lambda x: "A" if x > 10 else "B" if x > 5 else "C" # 非常に追いづらい - 無名関数を「変数に代入して使い回す」のは推奨されない(公式ガイドライン):Pythonの公式スタイルガイド(PEP 8)では、
func = lambda x: x + 1のように、lambdaにわざわざ名前を付けて変数に入れる行為を非推奨としています。なぜなら、「名前を付けて何度も使い回すなら、最初からdef func(x):と書いた方が親切でデバッグもしやすい」からです。あくまでkey=lambda...のように、引数の中に直接埋め込んで使い捨てるのが正しいエチケットです。 - エラーが起きたときに犯人の特定が遅れる(デバッグの難しさ):
lambdaの中で発生したエラーは、プログラムのログ(トレースバック)に出力された際、関数名がすべて<lambda>としか表示されません。同じファイルに何個もlambdaが埋め込まれていると、どのlambdaが爆発したのかを突き止めるのが困難になります。
lambdaのよくある質問
- Q: `lambda` の中では、複数行にわたる処理や、新しい変数の定義(x = 10など)はできないのですか?
- A: 完全に不可能です。
lambdaの内部は「純粋な1つの式(Expression)」でなければならないという文法上の強い縛りがあります。そのため、値の代入(=)やforループ、複数の文をまたぐ記述は一切拒否されます。そうした構造が必要な場合は、def構文を使用する合図です。 - Q: `lambda` を使った `map()` や `filter()` は、リスト内包表記で書き換えた方がいいと聞いたのですが?
- A: 現代のPython実務においては、その通りです。
map()やfilter()にlambdaを噛ませる記述は、現在では「リスト内包表記」を使って書いた方が、実行スピードが速く、見た目も圧倒的にスッキリして分かりやすいと評価される傾向にあります。# map + lambda res1 = list(map(lambda x: x ** 2, numbers)) # 現代の推奨:リスト内包表記(同じ結果が得られ、視覚的にも美しい) res2 = [x ** 2 for x in numbers]現在、
lambdaの主戦場は、内包表記では代替できないsorted(lists, key=lambda ...)やmax(),min()などのキー関数指定となっています。
まとめ
lambda は、関数を定義する手番を究極にショートカットし、その場限りのロジックを直感的に書き下すための軽量キーワードです。
- 関数名を付ける必要がないため、名前の衝突(競合)を恐れずに使い捨ての処理を作成できる。
sorted()の並び替えルールを指定するなど、高階関数への引数としてスマートに埋め込む用途で威力を発揮する。- 制限として「1行の式」しか記述できないため、少しでもロジックが複雑化しそうなら、すぐに
defを使った通常関数へ昇格させる。
lambda の限界と得意分野を正確に線引きし、データ処理の局所でスマートに差し込めるようになることで、Pythonならではの「シンプルで無駄のない流れるようなコード」を実装できるようになりましょう。