34.無名関数

さてこれまでは関数についての授業を行ってきましたが、
今回は無名関数というものについてのお話です。

ソートの回で少しだけ触れた
lambda ラムダ というものについてです。
ラムダ式とも呼び、名前のない関数を作ることができます。

ラムダ式の書き方:

lambda 引数 : 処理

普通の関数の書き方だと

In [1]:
def add (a,b):
    return a+b
print(add(2,3))
5

次にラムダを使った無名関数だと

In [2]:
add = lambda a,b : a+b
print(add(2,3))
5

ラムダの後に書いた変数を受け取って : の後の処理が実行されます。

ラムダ式で変数addに関数を代入し
その変数を用いると関数が実行される仕組みです

通常の関数との違いはほとんどなく
関数を定義したほうが無難です。

ラムダ式が効力を発揮するのはsortなどの時です。

辞書型の値でソートの際にこのラムダ式が出てきました。

In [3]:
dct ={ 3:7 , 5:6 ,1:3 }
# 辞書型を値で昇順ソートする。
print(sorted(dct.items(), key=lambda x:x[1]))
[(1, 3), (5, 6), (3, 7)]

key= 以降がラムダ式です。
sorted 関数の引数 key が関数を受け取れます。

複雑なソートをする場合にラムダ式が役立ちます。

In [4]:
lis1 = [2,3,4,5,7]
# 要素を3で割った余りでソートするような場合
print(sorted(lis1 , key=lambda x:x%3))
[3, 4, 7, 2, 5]

辞書型の際はキーと値をタプル型で返してきます。

In [5]:
dct ={ 3:7 , 5:6 ,1:3 }
print(sorted(dct.items(), key=lambda x:x[1]))
[(1, 3), (5, 6), (3, 7)]

key=lambda x:x[1] のインデックス部分で
1つ目 [0] がキー、二つ目 [1] が値となります。

値でソートしたいのなら、
ラムダ式ではインデックスが二つ目
すなわち 1 となるので key=lambda x:x[1]
と指定することになるのです。

これは複合したデータの並び替えなどで役立つことになります。

In [6]:
# 多重のリストを定義
complex_list = [[1,2,3]   ,  [3,5,2]    ,   [2,6,8]]
print(complex_list)
[[1, 2, 3], [3, 5, 2], [2, 6, 8]]
In [7]:
# リストの最初の値で並び替え
print(sorted(complex_list,key=lambda x : x[0]))

# リストの2番目の値で並び替え
print(sorted(complex_list,key=lambda x : x[1]))

# リストの3番目の値で並び替え
print(sorted(complex_list,key=lambda x : x[2]))
[[1, 2, 3], [2, 6, 8], [3, 5, 2]]
[[1, 2, 3], [3, 5, 2], [2, 6, 8]]
[[3, 5, 2], [1, 2, 3], [2, 6, 8]]

大きなリストの要素として存在するリストの並べ替えのキーを
リストの各項目で定義することができます。

このようにすればどのようなデータの形でも対応できるようになるので
ラムダ式が大活躍します。

関数を定義するまでもないような小さな処理に向いていますので
関数やソートでの利用の仕方を覚えておきましょう。