lambda 式

ある処理を関数で行う必要があるが、わざわざ関数を書くほどもない、という場合に lambda 式を使う。lambda 式を使用すれば、簡単な関数処理を 1 行で清潔に記述できる。lambda 式は、sortedsortmap、および 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 式を使用するとき、オブジェクトに代入せず、直接 sortedmapfilter などの関数に代入して使うことが推奨されている。このように、名前を付けないで使う関数のことを無名関数という。上で紹介した例を無名関数として書く場合は次のようになる。

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]