C
Python/中級/Lesson 10

ラムダ関数 (Lambda)

30分·theory
このチャプター
2/8
Python

ラムダ関数 (Lambda)

🎯 このレッスンを読み終えると

このレッスンを読み終えると、以下の3つを自信を持ってできるようになります。

  • ✅ lambda + map / filter / sorted の key 引数
  • ✅ lambda が複雑になったら名前付き関数に切り出す
  • ✅ functools.partial で引数を固定する

学習目標をチェックリストとして持ち、すべて答えられるようになったらレッスンを閉じましょう。

lambda の5つのパターン — コード + 実行結果

lambda = 名前のない1行関数。短い関数をその場で作りたいときに使う。


1. def vs lambda — 同じ関数

python
# 通常の関数
def 足し算(a, b):
    return a + b

# 同じことを lambda で
足し算 = lambda a, b: a + b

print(足し算(3, 5))      # 8

lambda 引数: 式return は自動。


2. 本当の使いどころ — sorted() の key

python
生徒たち = [
    ("山田太郎", 28, 85),
    ("鈴木一郎", 30, 92),
    ("田中花子", 25, 78),
]

# 点数 (3番目 = index 2) 順でソート
点数順 = sorted(生徒たち, key=lambda x: x[2])
print(点数順)
# [('田中花子', 25, 78), ('山田太郎', 28, 85), ('鈴木一郎', 30, 92)]

# 点数降順
点数降順 = sorted(生徒たち, key=lambda x: -x[2])

key=lambda x: ... が lambda の最大の用途。一度使い捨てる関数。


3. map · filter と組み合わせる

python
数字たち = [1, 2, 3, 4, 5]

# map — 変換
二乗 = list(map(lambda x: x * x, 数字たち))
print(二乗)              # [1, 4, 9, 16, 25]

# filter — フィルタリング
偶数 = list(filter(lambda x: x % 2 == 0, 数字たち))
print(偶数)              # [2, 4]

⚠️ ただし list comprehension の方がよりPythonic — [x*x for x in 数字たち]


4. dict のソート — value 基準

python
点数 = {"山田太郎": 85, "鈴木一郎": 92, "田中花子": 78}

# value 基準でソート
ソート済み = sorted(点数.items(), key=lambda kv: kv[1], reverse=True)
print(ソート済み)
# [('鈴木一郎', 92), ('山田太郎', 85), ('田中花子', 78)]

5. 悪い例 — lambda の乱用

python
# ❌ このように使わないでください — 名前のある関数の方が明確
値_検証 = lambda x: isinstance(x, int) and x > 0 and x < 100

# ✅ def で明確に
def 値_検証(x):
    """1~99の間の正の整数か確認"""
    return isinstance(x, int) and 0 < x < 100

ルール: lambda はその場で一度だけ使うときに限る。名前をつけるなら def


一行まとめ

用途
sorted keysorted(xs, key=lambda x: x[1])
mapmap(lambda x: x*2, xs)
filterfilter(lambda x: x>0, xs)
dict のソートsorted(d.items(), key=lambda kv: kv[1])

要点: 名前のない短い使い捨て関数。長くなったら def。

💻 ラムダ関数の例
# 基本のラムダ
add = lambda x, y: x + y
print(add(3, 5))  # 8

# 通常の関数と比較
def add_func(x, y):
    return x + y

# ソートキーとして活用
students = [
    {'name': '太郎', 'score': 85},
    {'name': '花子', 'score': 92},
    {'name': '次郎', 'score': 78}
]

# 点数基準でソート
sorted_students = sorted(students, key=lambda x: x['score'])
print([s['name'] for s in sorted_students])  # ['次郎', '太郎', '花子']

# 逆順ソート
sorted_desc = sorted(students, key=lambda x: x['score'], reverse=True)

# タプルリストのソート
pairs = [(1, 'b'), (2, 'a'), (3, 'c')]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs)  # [(2, 'a'), (1, 'b'), (3, 'c')]

# 条件式と組み合わせて
check = lambda x: "正の数" if x > 0 else "負の数" if x < 0 else "ゼロ"
print(check(5))  # 正の数

💡 重要ポイント

1. ラムダは単一の式のみ使用可能(文は不可)
2. 複雑なロジックには通常の関数を推奨
3. sorted()、max()、min() の key 引数に活用

Python は簡潔で読みやすい構文により、幅広い分野で活用されています。インタープリタ言語であるため、REPL 環境で即座に実行できます。PEP 8 コーディングスタイルガイドに従い、Black/autopep8 で自動フォーマットします。型ヒント(type hints)によりコードの可読性と IDE サポートが向上します。pip でパッケージを管理し、venv/conda で仮想環境を構成します。

🐍 実際に試してみよう — ラムダ関数 (Lambda)

上の概念を実際にコードとして実行してみてください。値を変えながらどのように動作するかを直接確認するのが最も速い学習方法です。
✏️ Python 코드
📟 コンソール出力
▶ 実行ボタンを押してください
🐍 Pyodideで実際のPythonを実行 — 初回は読み込みに3〜5秒

🤖 AIにこう依頼してみよう

このレッスンの概念を知っていれば、AIに具体的な指示を出せます。漠然とした「直して」ではなく、語彙のあるリクエスト — それがトークン節約の出発点です。

  • 「この関数に型ヒント + docstring を追加して」
  • 「この関数の副作用(グローバル変数の変更)を除去して純粋関数に変えて」

なぜこれがトークンを減らすのか

概念を知らないと、AIの回答を受け取っても「それってどういう意味ですか?」と再び聞き直す必要があります。その「聞き直し」がトークンを消費します。概念を一度理解しておくと、会話が一度で完結します。

先に読むとよい概念: リスト内包表記
次のおすすめ: ジェネレーター
ラムダ関数 - Python