lambda 関数

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

lambda 関数 とは

1 行で関数を書く lambda 式の使い方を学びます。本レッスンでは、lambda 関数 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

lambda 関数

ここまで関数は def で定義してきました。しかし Python には、もう 1 つ関数を作る方法があります。lambda (ラムダ) 式です。lambda を使うと、関数を 1 行で書けます。名前を付けずにその場で関数を作れるので、無名関数 (anonymous function) とも呼ばれます。

lambda は「使い捨ての小さな関数」を書くための文法です。後で出てくる mapfiltersorted などの高階関数と組み合わせると真価を発揮します。

文法

基本形は 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 が本当に輝くのは、関数を引数として渡すときです。たとえば sortedkey 引数に渡して、ソート条件をその場で書けます。

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 ...) と組み合わせたときの流れを見てみます。

diagram (will load when visible)

lambda は「並べ替えの基準をその場で書く小さな関数」のようなものです。sorted の中で 1 要素ずつ呼び出され、戻り値がソートのキーになります。

よくある間違い

  • lambda の中で代入 = を使おうとする (式ではないので使えない)
  • 複数行の処理を 1 つの lambda に詰め込んで読めなくなる
  • lambda を変数に代入して def の代わりに使う

Python

bad = lambda x: x = x + 1

これは SyntaxError です。代入は文 (statement) であって式 (expression) ではないので、lambda の中には書けません。代入のような処理が必要なら def を使いましょう。

「1 行で済む変換」だけ lambda で書く、というのが健全な使い方です。複雑なロジックを 1 行に詰め込むと、後で読み返したときに自分でも理解できなくなります。

実例

もう少し実用的な例を見てみましょう。maxkey 引数に 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 を書いてみましょう。並べ替えには sortedkey 引数に 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 つができることを確認しましょう。

  1. lambda 関数 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. lambda 関数 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. sorted の key 引数に lambda を渡してソートする
  2. lambda w: len(w) のように文字数を返す式を書く
  3. 元のリストは書き換えず、新しいリストを返す

入出力例

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"]

ヒント

main.py
main.py
学習モード

メモ

lambda 関数

⌘S で保存