search
LoginSignup
586

posted at

updated at

Pythonのlambdaって分かりやすい

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の解説でしたー

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
586