基礎

Pythonのlambda式|無名関数の書き方と使いどころ

lambda式は、名前を付けずに小さな関数を定義する構文です。1行で簡単な処理を行う関数が必要なとき、defで関数を定義するよりも簡潔に書けます。sorted()map()filter()と組み合わせて使うことが多いです。

この記事では、lambda式の基本構文から、実践的な使い方、使うべき場面と避けるべき場面まで詳しく解説します。

基本的な使い方

lambda式の構文は lambda 引数: 式 です。

Python
# 通常の関数
def add(a, b):
    return a + b

# lambda式で同じ処理
add_lambda = lambda a, b: a + b

print(add(3, 5))
print(add_lambda(3, 5))

# 1引数のlambda
double = lambda x: x * 2
print(double(10))

# 引数なしのlambda
greet = lambda: "こんにちは!"
print(greet())
実行結果
8
8
20
こんにちは!

sorted()との組み合わせ

lambda式が最もよく使われるのは、sorted()key引数です。

Python
# 文字列の長さでソート
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)

# 辞書のリストをソート
users = [
    {"name": "太郎", "age": 25},
    {"name": "花子", "age": 30},
    {"name": "次郎", "age": 20},
]

# 年齢でソート
by_age = sorted(users, key=lambda u: u["age"])
for user in by_age:
    print(f"  {user['name']}: {user['age']}歳")

# タプルの2番目の要素でソート
data = [(1, "c"), (3, "a"), (2, "b")]
print(sorted(data, key=lambda x: x[1]))
実行結果
['date', 'apple', 'banana', 'cherry']
  次郎: 20歳
  太郎: 25歳
  花子: 30歳
[(3, 'a'), (2, 'b'), (1, 'c')]

map()とfilter()

map()はすべての要素に関数を適用し、filter()は条件を満たす要素を抽出します。

Python
# map(): 各要素に関数を適用
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(f"二乗: {squared}")

# filter(): 条件を満たす要素を抽出
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(f"偶数: {evens}")

# 文字列リストの変換
names = ["taro", "hanako", "jiro"]
capitalized = list(map(lambda s: s.capitalize(), names))
print(capitalized)
実行結果
二乗: [1, 4, 9, 16, 25]
偶数: [2, 4]
['Taro', 'Hanako', 'Jiro']
map/filterよりリスト内包表記

多くの場合、map()filter()はリスト内包表記で書き換えられます。例えば list(map(lambda x: x**2, nums))[x**2 for x in nums] と同じです。Pythonではリスト内包表記の方が好まれる傾向にあります。

max()・min()との組み合わせ

Python
products = [
    {"name": "りんご", "price": 200},
    {"name": "バナナ", "price": 100},
    {"name": "ぶどう", "price": 500},
    {"name": "みかん", "price": 150},
]

# 最も高い商品
most_expensive = max(products, key=lambda p: p["price"])
print(f"最高値: {most_expensive['name']} ({most_expensive['price']}円)")

# 最も安い商品
cheapest = min(products, key=lambda p: p["price"])
print(f"最安値: {cheapest['name']} ({cheapest['price']}円)")
実行結果
最高値: ぶどう (500円)
最安値: バナナ (100円)

実践的な使い方

Python
# データ処理パイプライン
raw_data = ["  Tokyo  ", "  osaka", "NAGOYA  ", "fukuoka  "]

# lambda + mapで一括処理
cleaned = list(map(lambda s: s.strip().title(), raw_data))
print(cleaned)

# 複数条件でのソート
students = [
    ("太郎", "A", 85),
    ("花子", "B", 92),
    ("次郎", "A", 78),
    ("美咲", "B", 88),
]

# クラス昇順、点数降順でソート
sorted_students = sorted(students, key=lambda s: (s[1], -s[2]))
for name, cls, score in sorted_students:
    print(f"  {cls}組 {name}: {score}点")
実行結果
['Tokyo', 'Osaka', 'Nagoya', 'Fukuoka']
  A組 太郎: 85点
  A組 次郎: 78点
  B組 花子: 92点
  B組 美咲: 88点
lambda式の使いすぎに注意

lambda式は1行の簡単な処理にのみ使いましょう。複雑な処理や複数行の処理が必要な場合は、defで通常の関数を定義する方が可読性が高くなります。PEP 8(Pythonのスタイルガイド)でも、lambda式を変数に代入するよりdefで定義することが推奨されています。

まとめ

  • lambda 引数: 式 で無名関数を作成できる
  • sorted()key引数との組み合わせが最も一般的
  • map(), filter(), max(), min()とも相性が良い
  • 複雑な処理にはdefを使い、lambda式は簡単な処理に限定する
  • リスト内包表記で代替できる場合はそちらを優先する