ある処理を関数で行う必要があるが、わざわざ関数を書くほどもない、という場合に lambda 式を使う。lambda 式を使用すれば、簡単な関数処理を 1 行で清潔に記述できる。lambda 式は、sorted
、sort
、map
、および filter
などの関数とともに用いられることが多い。関数と lambda 式の対応は以下のようになっている。
def 関数名(引数1, 引数2, ...): 処理結果 = 処理式 return 処理結果
lambda 引数1, 引数2, ...: 処理式
下に、引数 x
を受け取り、それ 2 乗して返すような処理を関数と lambda 式で表す例を示した。
def f(x):
y = x * x
return y
g = lambda x: x * x
b1 = f(10)
b1
# 100
b2 = g(10)
b2
# 100
sorted
sorted
関数および sort
メソッドは、入力されたリスト(あるいはイテレータ)を、ある基準 key
に基づいて並べ替えを行う関数である。並べ替え基準を key
引数を通して、関数の形で与える必要がある。この関数は、リスト中のある要素を受け取り、何らかの処理を行って、整数値を返す必要がある。そして、sorted
関数は、その整数値に基づいてリストの並べ替えを行う。key
に代入する関数を調整することにより、リスト要素の文字列をその長さに応じて並べ替えたり、文字列の最後の文字に基づいて並べ替えたりすることができる。
a = ['Kanagawa', 'Tokyo', 'Saitama']
def f1(x):
return len(x)
f2 = lambda x: len(x)
sorted(a, key=f1)
# ['Tokyo', 'Saitama', 'Kanagawa']
sorted(a, key=f2)
# ['Tokyo', 'Saitama', 'Kanagawa']
f3 = lambda x: x[-1]
a.sort(key=f3)
a
# ['Kanagawa', 'Saitama', 'Tokyo']
sorted
関数の key
に代入する関数を工夫することで、2 次元リストを自由に並べ替えることができる。例えば、県名と人口からなる 2 次元リストを、県名順に並べ替えたり、人口順に並べ替えたりすることができる。
a = [['Kanagawa', 905.8],
['Tokyo', 927.3],
['Saitama', 733.9]]
f1 = lambda x: x[0]
sorted(a, key=f1)
# [['Kanagawa', 905.8],
# ['Saitama', 733.9],
# ['Tokyo', 927.3]]
f2 = lambda x: x[1]
sorted(a, key=f2)
# [['Saitama', 733.9],
# ['Kanagawa', 905.8],
# ['Tokyo', 927.3]]
map
map
関数は、リストなどのイテレーターの各要素に対して、何らかの処理を適用する組み込み関数である。リストの各要素に対して関数処理を行うとき、for
構文を使うことができるが、map
関数を使用することで、1 行で記述できるようになる。map
関数は、関数処理とリストを引数として受け取り、その処理結果をイテレーターとして返す。なお、イテレーターをリストに変換するには list
関数を使用する。
a = [2, 4, 6, 8, 10]
def f1(x):
return x*x
b = []
for i in a:
b.append(f1(i))
b
# [4, 16, 36, 64, 100]
f2 = lambda x: x*x
c = map(f2, a)
list(c)
# [4, 16, 36, 64, 100]
filter
filter
関数は、リストなどのイテレーターの各要素の中から、ある条件を満たす要素を抽出する関数である。filter
関数は、条件処理を行う関数とリストを受け取り、フィルタリングの結果をイテレーターとして返す。条件処理を行う関数は True
または False
を返す必要がある。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = lambda x: x % 2 == 0
b = filter(f, a)
list(b)
# [2, 4, 6, 8]
無名関数
上で挙げた lambda 式は、はじめに lambda 式をあるオブジェクトに代入してから、そのオブジェクトを関数をして使っていた。しかし、一般的には lambda 式を使用するとき、オブジェクトに代入せず、直接 sorted
、map
、filter
などの関数に代入して使うことが推奨されている。このように、名前を付けないで使う関数のことを無名関数という。上で紹介した例を無名関数として書く場合は次のようになる。
a1 = ['Kanagawa', 'Tokyo', 'Saitama']
f1 = lambda x: len(x)
sorted(a1, key=f1)
# ['Tokyo', 'Saitama', 'Kanagawa']
sorted(a1, key=lambda x: len(x))
# ['Tokyo', 'Saitama', 'Kanagawa']
a2 = [2, 4, 6, 8, 10]
f2 = lambda x: x*x
list(map(f2, a2))
# [4, 16, 36, 64, 100]
list(map(lambda x: x*x, a2))
# [4, 16, 36, 64, 100]
a3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f3 = lambda x: x % 2 == 0
list(filter(f3, a3))
# [2, 4, 6, 8]
list(filter(lambda x: x % 2 == 0, a3))
# [2, 4, 6, 8]