大宮盆栽デイズ - Omiya Bonsai Days -

冗談めかす埼玉のファインマン

ラムダを理解するのが難しい@CheckiO@Absolute Sorting

CheckiO が面白すぎて夢中になってしまいます。今回取り組んだワーク(Absolute Sorting)の回答例にlambda(ラムダ)が入っていました。

def checkio(numbers_array: tuple) -> list:
    return sorted(numbers_array, key=lambda x: abs(x))


#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    print('Example:')
    print(list(checkio((-20, -5, 10, 15))))

    def check_it(array):
        if not isinstance(array, (list, tuple)):
            raise TypeError("The result should be a list or tuple.")
        return list(array)

    assert check_it(checkio((-20, -5, 10, 15))) == [-5, 10, 15, -20], "Example"  # or (-5, 10, 15, -20)
    assert check_it(checkio((1, 2, 3, 0))) == [0, 1, 2, 3], "Positive numbers"
    assert check_it(checkio((-1, -2, -3, 0))) == [0, -1, -2, -3], "Negative numbers"
    print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")

このコードで注目するところは、lambda が入った冒頭部分。

def checkio(numbers_array: tuple) -> list:
    return sorted(numbers_array, key=lambda x: abs(x))

lambda を理解しないといけないのはわかるけれど。まずは通常、どういうふうに書くのかを知りたい。lambda をバラバラにしてみました。 まずは、次の構文を理解しないといけないようです。

lambda 引数 : 返り値 Qiita

上にある一行は、次のような関数と同じだそうです。

def sample_func(引数):
    return 返り値

lambda x: abs(x) を置き換えると、下のようになります。

def sample_func(x):
    return abs(x)

そうなると、sorted や key の扱いがどうなるかが気になります。単純に書いてしまうと、下のようになります。関数の sample_func の丸かっこが無いところに注意です。sample_func という関数を実行するのではなく、定義したオブジェクトを入れることを意味しているようです。このへんは完全にチンプンカンプン。

def sample_func(x):
    return abs(x)
return sorted(numbers_array, key=sample_func)

初学者は sorted については次のように覚えておくほうがよいようです。

sorted(【リストor辞書】, key=lambda x: 【keyにしたい要素】) Qiita

lambda については何度も何度も読む機会を増やしていくのがいいかもしれません。つどつど分解して読むという方法もありますが、できれば学習によって lambda を習得したいところです。