lambda(無名関数) ってネタにされることが多いですよね。
その割にあんまり使われない。
でも、実はかなり使い勝手のいいものなんですよ!
『lambdaわからないおじさんです!!』って人のための、解説です。
※Python3でのlambdaの解説なので、ほかの言語に関しては当てにしないでください。
文法
lambdaは
lambda 引数: 返り値
という形で書きます。
短く書いているだけですので、無名ではなくする(関数を定義する)と
def func(引数):
return 返り値
と同等です。上記のlambda式と、関数funcは同じ実行をします。 つまり
def double(n):
return n * 2
lambda_ver = lambda n: n * 2
print(double(2) == lambda_ver(2))
# True
となります
あるいは、以下のように引数をつけずに実行することも可能です。
lambda: random.rand()
また、引数を複数用いることもできますし、可変長引数やキーワード引数の受付も可能です。
f = lambda x, *args, rival, **kwargs: [rival, args, kwargs]
f(1, 2, 3, rival="ruby", name="python", author="Guido")
# ['ruby', (2, 3), {'name': 'python', 'author': 'Guido'}]
すごく簡単ですよね。
何が嬉しいの?
lambdaを使うと何が嬉しいかというと、mapやsortの時、特別な動作をしたいけれど、わざわざ関数を定義するのもなぁ… っていうときにパパっとかける点です。
たとえば、すでにある整数のlistにそれぞれを2乗して符号はそのままにしたい!なんてことがあるかもしれません。その時に関数を定義すると、
from math import copysign
lis = [2, -10, 5, -3, 6, 7, -8]
def func(n):
return int(copysign(n**2, n))
# return n ** 2 * [1, -1][n < 0] と同義
lis = list(map(func, lis))
# [4, -100, 25, -9, 36, 49, -64]
というようになります。
こんなことのために毎回関数を用意していたら面倒ですよね。
なので、
from math import copysign
lis = [2, -10, 5, -3, 6, 7, -8]
lis = list(map(lambda x: int(copysign(x**2, x)), lis))
# [4, -100, 25, -9, 36, 49, -64]
という風にlambdaを使って書くことができます。
また、名前と得点をtupleとして持っているlistを、得点でsortしたい!(tupleを要素として持つlistを、それぞれのtupleの2番目の要素でsortしたい)
といったときにも
score = [("Adam", 64), ("Bob", 82), ("Charlie", 21), ("David", 91)]
score.sort(key=lambda x: x[1])
#[('Charlie', 21), ('Adam', 64), ('Bob', 82), ('David', 91)]
という風にできます。
どうですか。
新開地が開けそうでしょう…
ということで、lambdaの解説でしたー