Pythonのlambdaとは
Pythonのlambdaは、関数を一行で書くための構文です。「ラムダ式」または「ラムダ関数」とも呼ばれます。
通常、関数はdefキーワードを使って定義しますが、lambdaを使うと名前をつけずに小さな関数を作ることができます。こうした「名前のない関数」を無名関数(または匿名関数)と呼びます。
主に、他の関数の引数として渡すときや、短い処理を一行にまとめたいときに使います。
lambdaの基本的な書き方
lambdaの構文はシンプルです。
lambda 引数: 式
defで定義した関数と比べると、次のようになります。
# def を使った書き方
def add(x, y):
return x + y
# lambda を使った書き方
add = lambda x, y: x + y
# どちらも同じ結果になる
print(add(3, 4))
# 7
lambdaの右側に書いた式の値が、そのまま戻り値になります。returnは不要です。
ただし、変数に代入して使う書き方(add = lambda ...)は、PEP8(Pythonのスタイルガイド)では推奨されていません。変数に代入するならdefを使う方が読みやすく、デバッグもしやすいとされています。lambdaが活きる場面は、後述する「引数として渡すとき」です。
引数の書き方パターン
lambdaでは、引数の数に応じてさまざまな書き方ができます。
引数が1つの場合
square = lambda x: x ** 2
print(square(5))
25
引数が複数の場合
カンマで区切って並べます。
multiply = lambda x, y: x * y
print(multiply(3, 4))
12
引数がない場合
引数を省略できます。
greet = lambda: "こんにちは"
print(greet())
こんにちは
デフォルト引数を使う場合
defと同じように、デフォルト値を設定できます。
power = lambda x, n=2: x ** n
print(power(3)) # nを省略 → 3の2乗
print(power(3, 3)) # nを指定 → 3の3乗
9
27
lambda式がよく使われる場面
lambdaは単体よりも、他の関数と組み合わせるときに本領を発揮します。
sorted()のkey引数と組み合わせる
リストをある基準でソートするときに使います。
students = [("田中", 85), ("佐藤", 72), ("鈴木", 91)]
# 点数(タプルの2番目の要素)でソート
sorted_students = sorted(students, key=lambda x: x[1])
print(sorted_students)
[('佐藤', 72), ('田中', 85), ('鈴木', 91)]
key=lambda x: x[1]の部分で「各要素のどこを基準にするか」を指定しています。
map()と組み合わせる
リストの各要素に同じ処理を適用するときに使います。
prices = [100, 200, 300, 400]
# 消費税10%を加算
prices_with_tax = list(map(lambda x: int(x * 1.1), prices))
print(prices_with_tax)
[110, 220, 330, 440]
filter()と組み合わせる
条件を満たす要素だけを取り出すときに使います。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数だけ取り出す
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
[2, 4, 6, 8, 10]
複数行の処理はlambdaで書けるか
結論から言うと、lambdaは原則として1行(1つの式)しか書けません。
lambdaの中には「式」だけが書けます。if文やfor文のような「文」は書けないため、複数行の処理には対応していません。
# これはエラーになる
f = lambda x:
y = x * 2
return y
複数行の処理が必要な場合は、defで定義した関数を使いましょう。
# def を使えば複数行の処理が書ける
def double_and_add(x, y):
result = x * 2
result += y
return result
print(double_and_add(3, 5))
11
なお、三項演算子(条件式)を使えば、lambdaの中で条件によって値を変えることはできます。ただし、条件分岐の応用的な書き方については、別記事で詳しくまとめています。
よくあるミスと注意点
複数の式を並べようとしてしまう
lambdaの中にカンマで式を並べると、意図した動作にならないことがあります。
# カンマで2つ書くとタプルになる(エラーにはならないが意図と違う)
f = lambda x: x * 2, x + 1 # NameError: name 'x' is not defined
このような場合はdefで書き直すのが適切です。
lambda自体に副作用を持たせようとする
lambdaは「値を返す式」として使うものです。print()などの副作用を持たせることはできますが、読みやすさが大きく下がります。
# 動くが、可読性が低い
f = lambda x: (print(x), x * 2)[1]
print(f(5))
5
10
このように無理な書き方をするより、defを使う方が保守しやすいコードになります。
戻り値がNoneになるケース
lambdaの式部分にNoneを返す処理(例:list.sort())を書くと、戻り値がNoneになります。
# list.sort() はNoneを返すため、resultはNoneになる
nums = [3, 1, 2]
f = lambda x: x.sort()
result = f(nums)
print(result) # None
None
戻り値として使いたい場合は、sorted()のようにリストを返す関数を使いましょう。
f = lambda x: sorted(x)
result = f([3, 1, 2])
print(result)
[1, 2, 3]
AI時代での補足
lambdaのような短い構文は、AIがコードを生成する際によく使われます。AIが出力したコードにlambdaが含まれていたとき、構文の意味と制約を知っていると、意図通りの動きかどうかをすぐに確認できます。
まとめ
この記事で解説した内容を整理します。
lambdaは名前のない関数を一行で書く構文- 書き方は
lambda 引数: 式 - 引数は0個・1個・複数・デフォルト値など
defと同様に使える sorted()・map()・filter()のkey/関数引数と組み合わせるのが典型的な使い方- 複数行の処理は書けない。複雑な処理は
defを使う方が適切 - 戻り値が
Noneになりうる式には注意が必要
Pythonの学習を体系的に進めたい場合や、どこまで独学すべきか迷っている場合は、以下の記事も参考にしてみてください。