Pythonのlambdaによる無名関数の定義と使い方をわかりやすく解説

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
~
ad. 価格範囲を指定して商品を探せます

lambdaの概要

無名関数の定義 Python予約語

lambda

概要 lambda(ラムダ)は、名前を持たない関数(=無名関数、匿名関数)をその場にわずか 1行でコンパクトに定義 するためのキーワードです。

わかりやすく説明 lambda は、プログラムの中で使う「使い捨ての簡易ミニ関数」です。通常、Pythonで関数を作るには def を使って名前を決め、何行かコードを書く必要があります。しかし、「このリストの並び替えのときに、ちょっとだけ数値を2倍にして比較したい」といった1回限りの超小規模な処理に、わざわざ大げさな関数を定義するのは面倒です。lambda を使えば、名前を付けずにその場でスマートに処理を完結させられます。

  • 文法の中に return キーワードを書かなくても、評価した結果(右辺に書いた数式など)を自動的に戻り値として返します。
  • 1行でしか記述できず、内部で代入文(=)や複雑なループ処理を行うことはできません。
  • 主に、別の関数に処理のルールをバトンタッチして渡す「高階関数(sorted() や map() など)」の引数として絶大な威力を発揮します。

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ならではの「シンプルで無駄のない流れるようなコード」を実装できるようになりましょう。