Lambda式

lambda式とは

lambda(ラムダ)式とは、一時的に利用する無名関数を記述する方法で、以下の形式で記述します。

lambda式
lambda 引数: 戻り値

サンプルを見てみましょう。以下のサンプルでは引数xが奇数かどうかを判定した結果を返す関数をlambda式で記述しています。

func = lambda x: x % 2 == 1

is_odd = func(5)
print(is_odd)  # True

is_odd = func(6)
print(is_odd)  # False

funcには、引数xに対し、引数xが奇数かどうかを判定した結果を返す関数オブジェクトが格納されます。わかりづらい方は以下にdefを使った場合と比較してみてください。

def is_odd(x): 
    return x % 2 == 1

func = is_odd 

is_odd = func(5)
print(is_odd)  # True

is_odd = func(6)
print(is_odd)  # False

簡単な関数だと、lambda式で短く書けることがわかりますね。

lambda式のメリット

高階関数

では、短く書ける以外にlambda式を使うと何がいいのでしょうか?そのメリットを説明する前に、高階関数について説明しましょう。

関数オブジェクトのページで説明したとおり、Pythonの関数はオブジェクトとして扱うことができます。特に、関数オブジェクトを引数や戻り値にするものを高階関数と呼びます。

高階関数の例

def higher_order(datas, is_target):
    """ 高階関数のサンプル """
    for i in datas:
        if is_target(i):
            print(i)

def is_odd(num):
    return num % 2 == 1

datas = [1, 102, 900, 5, 3]
higher_order(datas, is_odd)

higher_orderは高階関数のサンプルで、引数で指定されたデータリストに対し、引数で指定された判定ロジックに該当するデータがあればそれをprintで出力する関数です。

上記サンプルでは、判定ロジックに「奇数かどうかを判定する関数」を渡しています。

では、「3の倍数かどうかを判定」する場合はどうすればよいでしょうか?

def higher_order(datas, is_target):
    """ 高階関数のサンプル """
    for i in datas:
        if is_target(i):
            print(i)

def is_multipleof3(num):
    return num % 3 == 0

datas = [1, 102, 900, 5, 3]
higher_order(datas, is_multipleof3) 

「3の倍数かどうかを判定する関数」を引数に指定しています。高階関数自身に修正が入らない点にメリットがありますね。

lambda式のメリット

それではいよいよlambda式の使いどころについてです。もうお気づきの方も多いと思いますが、高階関数を利用する際の使いきりの関数でわざわざdefで書くのは面倒です。そこで、上の高階関数をlambda式で書きなおしてみましょう。

def higher_order(datas, is_target):
    """ 高階関数のサンプル """
    for i in datas:
        if is_target(i):
            print(i)

datas = [1, 102, 900, 5, 3]
higher_order(datas, lambda x : x % 2 == 1)

いかがでしょうか。関数を短く書けた上、使い捨ての小さい関数がなくなったため、全体的にスッキリして本筋が読みやすくなったのではないでしょうか?