lambda 関数
lambda 関数 とは
1 行で関数を書く lambda 式の使い方を学びます。本レッスンでは、lambda 関数 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
lambda 関数
ここまで関数は def で定義してきました。しかし Python には、もう 1 つ関数を作る方法があります。lambda (ラムダ) 式です。lambda を使うと、関数を 1 行で書けます。名前を付けずにその場で関数を作れるので、無名関数 (anonymous function) とも呼ばれます。
lambdaは「使い捨ての小さな関数」を書くための文法です。後で出てくるmapやfilter、sortedなどの高階関数と組み合わせると真価を発揮します。
文法
基本形は lambda 引数: 式 です。
Python
double = lambda x: x * 2
print(double(5))def double(x): return x * 2 を 1 行に圧縮した形です。: の右側に書いた 式 がそのまま戻り値になります。return は書きません。
複数の引数も取れます。
Python
add = lambda a, b: a + b
print(add(3, 4))def との比較
両者を並べてみると違いがはっきりします。
Python
def double_def(x):
return x * 2
double_lambda = lambda x: x * 2どちらも同じ動きをしますが、用途が違います。
defは名前を持つ、複数行に渡る本格的な関数lambdaは名前を持たない、その場限りの式
業務コードで
double_lambda = lambda x: x * 2のように lambda を変数に代入するのはアンチパターンです。それならdefで書きましょう。PEP 8でも推奨されていません。次節で見るように、lambdaは名前を付けずに直接渡す場面で使うものです。
lambda の真価
lambda が本当に輝くのは、関数を引数として渡すときです。たとえば sorted の key 引数に渡して、ソート条件をその場で書けます。
Python
words = ["apple", "banana", "cherry", "date"]
result = sorted(words, key=lambda w: len(w))
print(result)len を使って文字数順にソートしています。わざわざ def get_length(w): return len(w) と関数を作る必要がありません。コードがコンパクトになります。
制約
lambda は 1 つの式しか書けません。複数行の処理や if/else ブロック、for ループは書けません。式が 1 行に収まらないなら、素直に def で書きましょう。
Python
max_value = lambda a, b: a if a > b else b
print(max_value(3, 7))三項演算子 (a if cond else b) は式なので、lambda の中で使えます。これを使えば簡単な分岐は表現可能です。
動きを追ってみる
sorted(key=lambda ...) と組み合わせたときの流れを見てみます。
lambda は「並べ替えの基準をその場で書く小さな関数」のようなものです。sorted の中で 1 要素ずつ呼び出され、戻り値がソートのキーになります。
よくある間違い
lambdaの中で代入=を使おうとする (式ではないので使えない)- 複数行の処理を 1 つの
lambdaに詰め込んで読めなくなる lambdaを変数に代入してdefの代わりに使う
Python
bad = lambda x: x = x + 1これは SyntaxError です。代入は文 (statement) であって式 (expression) ではないので、lambda の中には書けません。代入のような処理が必要なら def を使いましょう。
「1 行で済む変換」だけ
lambdaで書く、というのが健全な使い方です。複雑なロジックを 1 行に詰め込むと、後で読み返したときに自分でも理解できなくなります。
実例
もう少し実用的な例を見てみましょう。max の key 引数に lambda を渡して、辞書のリストから最大値を持つ要素を取り出します。
Python
users = [
{"name": "太郎", "score": 80},
{"name": "花子", "score": 95},
{"name": "次郎", "score": 70},
]
top = max(users, key=lambda u: u["score"])
print(top)lambda u: u["score"] で score を取り出して比較するように指示しています。これを def で書くと数行増えますが、lambda なら 1 行で済みます。
やってみよう
それでは、文字列のリスト words を受け取り、文字数の短い順 に並べ替えた新しいリストを返す関数 sort_by_length を書いてみましょう。並べ替えには sorted の key 引数に lambda を渡す書き方を使います。return sorted(words, key=lambda w: len(w)) の形が答えです。元のリストは書き換えず、新しいリストを返してください。テストでは sort_by_length(["apple", "banana", "cherry", "date"]) のような形で呼び出されます。
よくある質問
Q. lambda と def の使い分けは?
A. 1 行で書ける小さな関数なら lambda、複数行や名前を付けて再利用する関数は def を使います。sorted(items, key=lambda x: x.age) のように key 引数や map/filter と組み合わせるのが典型的な使い道です。
Q. lambda に複数文書けますか?
A. 書けません。lambda は式(expression)一つだけで構成されるため、文(statement)や複数行は def 関数に切り出します。複雑になったら必ず def に変えるのが可読性のコツです。
Q. lambda のスコープはどう決まりますか?
A. 定義された場所の外側スコープの変数を参照できます(クロージャ)。ループ内で lambda を作るとループ変数が遅延参照されるトラップ(全部最後の値になる)があるため、デフォルト引数で値を固定する(lambda x=i: x)回避策を覚えておくと安全です。
次のレッスン
次は 高階関数 で、1 行で関数を書く lambda 式の使い方を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- lambda 関数 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. lambda 関数 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- sorted の key 引数に lambda を渡してソートする
- lambda w: len(w) のように文字数を返す式を書く
- 元のリストは書き換えず、新しいリストを返す
入出力例
test-cases.txt
sort_by_length(["apple","banana","cherry","date"]) → ["date","apple","banana","cherry"]
sort_by_length([]) → []
sort_by_length(["python"]) → ["python"]
sort_by_length(["go","py","rust","java"]) → ["go","py","rust","java"]
sort_by_length(["dddd","a","ccc","bb"]) → ["a","bb","ccc","dddd"]