[解決!Python]ラムダ式(lambda)を記述して使うには解決!Python

ラムダ式は小規模で名前を持たない関数を簡潔に記述するのに使える。その記述方法や使う上で注意すべきポイントを紹介する。

» 2022年09月20日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 関数やメソッドの引数にラムダ式を指定
int_list = [8, 4, -10, 6, -5, -7, -8]
int_list.sort(key=lambda x: x if x >= 0 else -x)
print(int_list)  # [4, -5, 6, -7, 8, -8, -10]

d = {
    'kawasaki': {'age': 100, 'height': 129, 'weight': 129},
    'isshiki': {'age': 25, 'height': 180, 'weight': 68},
    'endo': {'age': 34, 'height': 176, 'weight': 72}
}
result = sorted(d.items(), key=lambda x: x[1]['age'])
print(dict(result))
# 出力結果:
#{'isshiki': {'age': 25, 'height': 180, 'weight': 68},
# 'endo': {'age': 34, 'height': 176, 'weight': 72},
# 'kawasaki': {'age': 100, 'height': 129, 'weight': 129}}

# ラムダ式を変数に代入すると、関数のように呼び出せる
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(7))  # False

# ラムダ式を返す関数
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(7))  # False

one_adder = make_adder(1)
print(one_adder(100))  # 101

# 関数定義を使うと上記コードは以下のようになる
def make_adder(x):
    def adder(y):
        return x + y
    return adder


ラムダ式

 ラムダ式(無名関数、匿名関数とも呼ぶ)とは「小規模な名前のない関数」のこと。小規模というのは、関数本体には式を1つしか記述できないことを意味する。名前はないが、ラムダ式を変数や関数やメソッドのパラメーターに束縛することで「名前(引数)」のようにして無名関数を呼び出せる。

 Pythonでは関数がそのパラメーターに関数オブジェクトを受け取ったり、関数を戻り値として返送したりできる。このような部分でラムダ式を便利に使える。

 ラムダ式は次の構文で記述する。

lambda パラメーターリスト: パラメーターを使った式を1つだけ


 パラメーターリストにはラムダ式が受け取るパラメーターを必要なだけ記述する。その後にコロン「:」で区切って式を1つだけ記述する。その式の評価結果がラムダ式の戻り値となる。記述できるのが式を1つだけなので、パラメーターリストに記述するパラメーターの数はそれほど多くはならない。

 以下に簡単な例を示す。

int_list = [8, 4, -10, 6, -5, -7, -8]
int_list.sort(key=lambda x: x if x >= 0 else -x)
print(int_list)  # [4, -5, 6, -7, 8, -8, -10]
#int_list.sort(key=abs)


 この例では「lambda x: x if x >= 0 else -x」とあるので、このラムダ式はパラメーターを1つ持ち、その値が0以上ならそれを戻り値とし、負値であれば符号を反転して正値にしたものを戻り値とする(絶対値の取得)。最下部のコメントにある通り、これはabs関数をkeyに渡せばできるのだが、例ということでラムダ式をあえて使っている。

 sortメソッドの中では要素を並べ替える際に、このラムダ式を呼び出して要素が絶対値順に並ぶように順序関係を決定する。

 このように、プログラムコードを書いているときに、その場その場で必要になるちょっとした処理を(わざわざ関数定義に頭を切り替えることなしに)コンパクトに書くというのがラムダ式のよくある使い方である。

 次の例は辞書を要素とする辞書で、内側の辞書の'age'キーの値を基準として並べ替えるコードだ。

d = {
    'kawasaki': {'age': 100, 'height': 129, 'weight': 129},
    'isshiki': {'age': 25, 'height': 180, 'weight': 68},
    'endo': {'age': 34, 'height': 176, 'weight': 72}
}
result = sorted(d.items(), key=lambda x: x[1]['age'])
print(dict(result))
# 出力結果:
#{'isshiki': {'age': 25, 'height': 180, 'weight': 68},
# 'endo': {'age': 34, 'height': 176, 'weight': 72},
# 'kawasaki': {'age': 100, 'height': 129, 'weight': 129}}


 itemsメソッドにより辞書のキー/値('kawasaki': {'age': 100, 'height': 129, 'weight': 129}など)が「(キー, 値)」というタプルとして反復される。このタプルがラムダ式「key=lambda x: x[1]['age']」に渡される。タプルの第1要素は「{'age': 100, 'height': 129, 'weight': 129」などの辞書なので、このラムダ式は辞書の'age'キーの値を戻り値とする。これにより、並べ替えのキーとして'age'が使われるので、出力結果にあるように、年齢順に外側の辞書の要素(である辞書)が並べ替えられる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。