Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
547
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Pythonのlambdaって分かりやすい

lambda(無名関数) ってネタにされることが多いですよね。

その割にあんまり使われない。

でも、実はかなり使い勝手のいいものなんですよ!

lambdaわからないおじさんです!!』って人のための、解説です。

※Python3でのlambdaの解説なので、ほかの言語に関しては当てにしないでください。

文法

lambdaは


lambda 引数: 返り値

という形で書きます。

短く書いているだけですので、無名ではなくする(関数を定義する)と

def func(引数):
    return 返り値

となります。上記のlambda式と、関数funcは同じ実行をします。 つまり

def double(n):
    return n * 2

lambda n: n * 2

となります。

よって


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]

というようになります。

こんなことのために毎回関数を用意していたら面倒ですよね。

なので、

lambda を使う場合

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]

という風に書くことができます。

また、名前と得点を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の解説でしたー

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
547
Help us understand the problem. What are the problem?