Pythonのラムダ式(無名関数)の使い方【lambda expressions】
Pythonのlambda式の使い方についてわかりやすく解説します。
無名関数(ラムダ式)とは?
Pythonの無名関数(ラムダ式)とは、その名の通り名前のない関数のことで、def
文による関数定義よりも簡潔に関数を作成することができる記法です。
後述するように、Pythonではlambda
というステートメントをつかって無名関数を定義します。そのため、ラムダ式とも呼ばれます。
lambdaの利用シーン
ラムダ式を利用するシチュエーションとしては、map
やsorted
などの関数と一緒に使うことが多いです。何かしらのフィルターや条件付けをする場合に、def
文で関数化するほどでもない短い式をlambda
で記述するという形で利用されます。
無名関数(ラムダ式)の基本的な書き方
Pythonの無名関数(ラムダ式)は、lambda 引数1, 引数2, ...: 式
という形で記述します。def
文による書き方と比較すると、引数を()
で囲んでいない、return
を書いていないなどの違いがあります。
# 無名関数(ラムダ式)の基本的な書き方
# 引数を一つとり、1を足して返す無名関数を変数に代入
sum_one = lambda x: x + 1
a = sum_one(10)
print(a)
# 11
# デフォルト引数をしていすることもできる
# 二つの引数を足す無名関数
my_sum = lambda x, y=1: x + y
a = my_sum(10, 20)
print(a)
# 30
b = my_sum(10)
print(b)
# 11
lambda式は、上述の例のように変数に代入して通常の関数と同じように使うことができます。しかし、Pythonのコーディング規約を定義するPEP8では推奨されていません。
lambda式は関数の引数として、呼び出し可能な関数オブジェクトを定義する際に使われるものなので、変数に代入して名前をつけるのは使い方としてあまり良くないということです。
後述するように、map()
関数やsorted()
関数などの引数として利用するのがベストプラクティスです。
無名関数(ラムダ式)をif文と合わせて使う
ラムダ式では三項演算子のような形でif文と合わせて利用することができます。以下では、非推奨ですが、わかりやすいように変数に代入する例を使用しています。
# 無名関数(ラムダ式)でif文を使う
# 戻り値の式を三項演算子にすることでif文を利用できる
check_odd_even = lambda x: '偶数' if x % 2 == 0 else '奇数'
print(check_odd_even(10))
# 偶数
print(check_odd_even(11))
# 奇数
無名関数(ラムダ式)の実践的な使い方
Pythonのラムダ式は単独で使用するのではなく、他の関数と一緒に利用することが多いです。具体的には、map
やsort
、filter
などの関数の中の条件式として利用されます。
filter関数とlambda式
filter()
関数は、リストやタプルなどから条件を満たす要素を抽出する関数です。第一引数にフィルターの役割を果たす関数、第二引数に対象のオブジェクト(リストなどのイテラブル)をとります。この第一引数にlambda
式を利用することがあります。
# fiterとlambda
# 正の値を返すフィルターを利用する
l = [-2, -1, 0, 1, 2]
positive_filter = filter(lambda x: x > 0, l)
print(list(positive_filter))
# [1, 2]
実際にfilter()
関数を利用する場合には、複雑な処理を別の関数で定義して使う方がベターで、簡単な条件であればリスト内包表記を使って新しいリストを作成する方が推奨されています。
map関数とlambda式
map()
関数は、リストなどのイテラブルの各要素に特定の関数を適用します。filter()
関数と同様に、適用する関数の指定をする第一引数にlambda
式を活用します。
# mapとlambda
# 全ての要素を2倍するマップを適用する
l = [-2, -1, 0, 1, 2]
double_map = map(lambda x: x * 2, l)
print(list(double_map))
# [-4, -2, 0, 2, 4]
こちらも、リスト内包表記で代用できます。
sortedやmaxなどの関数のkey引数にlambda式を利用する
Pythonではリストやタプルなどに対して、sorted()
関数やmax()
関数のように、並び替えや最大値の取得などの操作をする関数が用意されています。これらの関数には、中身の要素をどのような基準で選別するかを指定するkey
引数が用意されており、ここでlambda式を利用することができます。
以下、max()
関数を例に解説します。
# リストの要素の選別基準を指定するkeyにlambda式を使う
# max関数は通常は要素のうち最大値を返す
l = [-3, -2, -1, 0, 1, 2]
print(max(l))
# 2
# key引数で、各要素を比較する前に適用する関数を定義する
# 以下では、各要素を2乗したときの最大値を返す要素を抽出している
# (それぞれの要素を2乗した際に最大値を返すのは-3)
print(max(l, key=lambda x: x**2))
# -3
key
引数にはlambda式以外の通常のdef文による関数も利用することができますが、シンプルな内容の場合はlambdaで無名関数を利用した方がすっきりします。
一方で、複雑な処理や複数回同じ処理を利用したい場合には、def文による関数定義の方が便利でしょう。