引数にアンダースコアを付けたPythonのラムダ?


84

次のコードは何をしますか?

a = lambda _:True

インタラクティブプロンプトで読んでテストしたところ、常にを返す関数のようTrueです。

私はこれを正しく理解していますか?アンダースコア(_)も使用された理由を理解したいと思います。


10
パラメータのないラムダの場合、構文は次のとおりですlambda : True
Robino 2018年

17
私は、この投稿についての嫌いなものは「とラムダ関数についての質問のタイトルの話ということであるNOの変数、」しかし、質問本体、およびほとんどすべての答えのは、一つの変数/引数を持つラムダ関数の例を与えます。その変数_は、xoraなどではなく、たまたま奇妙な名前を持っています。引数を取らないラムダ関数の書き方を知りたい人がいたら、方法は次のとおりmy_lambda = lambda : 255です。次のように定義します。このように呼んでx = my_lambda()ください:あなたは255好きな戻り値で置き換えることができます。
つまようじアネモネ

2
@ToothpickAnemone素晴らしい返信!私は最近、defaultdictsを初期化するために変数なしでラムダを主に使用しています。このスレッドを読んでいる人々に役立つことを願っています。ht = {} ht = defaultdict(lambda:0、ht)
laycat 2018

回答:


143

_変数名です。それを試してみてください。(この変数名は通常、無視される変数の名前です。いわばプレースホルダーです。)

Python:

>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'

>>> l("foo")
True

したがって、このラムダには1つの引数が必要です。常にを返す引数のないラムダが必要な場合はTrue、次のようにします。

>>> m = lambda: True
>>> m()
True

7
@dopatramanはでそれをテストPython 3.6.2の下Mac OS 10.12、それが動作します。
winklerrr 2017

6
_変数自体が実際には必要ない場合に、変数名が一般的に使用されるという情報を追加できるかもしれません。これは「使い捨て変数」のようなもので、役に立たない単なるプレースホルダーです。
winklerrr 2017

1
@dopatraman Ipythonでは、_は最後の式によって返される値を保持します。このため、_の使用は避けています。 stackoverflow.com/questions/17580289/…–
桐谷太郎

7

アンダースコアは、未使用の変数に名前を付けるためのPythonの規則です(たとえば、静的分析ツールは未使用の変数として報告しません)。あなたの場合、ラムダ引数は使用されていませんが、作成されたオブジェクトは常にを返す単一引数関数Trueです。したがって、ラムダは数学の定数関数にいくぶん似ています。


だけでなく、それは言語に依存しないとアンダースコアのpython変換だ変数は、一時的または軽微であることを示すために使用される
SławomirLenart

6

関係なくTrueを返す関数のようです。

はい、それはTrueを返す関数(またはラムダ)です。アンダー通常無視変数のプレースホルダーであり、この場合には不要です。

このような関数のユースケースの例(ほとんど何もしません):

dd = collections.defaultdict(lambda: True)

defaultdictの引数として使用する場合True、一般的なデフォルト値として使用できます。


4

ラムダは関数を意味します。上記のステートメントは書くのと同じです

def f(_):
    return True

ラムダの場合、変数が存在する必要があります。したがって、_(同様にxy..を渡すことができます)という変数を渡します。


3

アンダースコア_は有効な識別子であり、ここでは変数名として使用されます。True関数に渡された引数に対して常に戻ります。

>>>a('123') 
True

こんにちは、迅速な返信ありがとうございます。それで、常にtrueを返す匿名関数ですか?
laycat 2015

@laycat; はい。常にtrueを返します。
haccks 2015

2

問題のコード行は次のとおりです。

a = lambda _:True

これは、1つの入力パラメーターを持つ関数を作成します_。アンダースコアは変数名のかなり奇妙な選択ですが、それは単なる変数名です。使用できます_ラムダ関数を使用しない場合でも、どこでも。たとえば、代わりに...

my_var = 5
print(my_var)

あなたは書くことができます:

_ = 5
print(_)

ただし、_パラメータ名の名前として、次のようなものではなく、理由がありました。xかをinput。これについては、すぐに説明します。

まず、ラムダキーワードがに似てdefいますが構文が異なる関数を構築することを知っておく必要があります。ラムダ関数の定義は、次のa = lambda _:Trueように記述します。

def a(_):
    return True

a入力パラメータ_で名前が付けられた関数を作成し、を返しますTrue。一つは、同じように簡単に記述することができa = lambda x:Trueて、x代わりにアンダースコアの。ただし、_その変数を使用する予定がない場合は、変数名として使用するのが慣例です。次のことを考慮してください。

for _ in range(1, 11):
    print('pear')

ループインデックスがループ本体の内部で使用されることは決してないことに注意してください。ループを指定された回数実行するだけです。なのでwinklerrr書かれており、「変数名が_ある[...]のような『使い捨ての変数』役に立たない、単なるプレースホルダ。」

同様に、 `` a = lambda x:Trueの場合、入力パラメーターは関数の本体内では使用されません。入力引数が存在する限り、それが何であるかは実際には問題ではありません。そのラムダ関数の作成者は、変数が使用されないことを示すため_に、のようなものの代わりに書き込みましたx

ラムダに引数があることに注意してください。だから、書く

a()、エラーが発生します。

引数のないラムダが必要な場合は、次のように記述します。

 bar = lambda: True

これでbar()、引数なしでを呼び出すと、問題なく機能します。引数をとらないラムダは、常に同じ値を返す必要はありません。

import random
process_fruit = lambda : random.random()

上記のラムダ関数は、常に同じ定数を返すものよりも複雑です。

プログラマーが時々lambda代わりにキーワードを使用する理由の1つdef は、特に短くて単純な関数のためです。lambda定義は通常1行にすべて収まることができますが、defステートメントで同じことを行うのは難しいことに注意してください。使用する別の理由lambdadef関数が再度使用されない場合にsfの代わり。後で関数を再度呼び出したくない場合は、関数に名前を付ける必要はありません。たとえば、次のコードについて考えてみます。

def apply_to_each(transform、in_container):out_container = list()for idx、item in enumerate(container、0):out_container [idx] = transform(item)return out_container

ここで、次の呼び出しを行います。

squares  = apply_to_each(lambda x: x**2 range(0, 101))

そのことに注意してください lambda x: x**2ラベルがいない。これは、後で再度呼び出すことはおそらくないためです。一時的に必要な、短くて単純なものでした。

ラムダ関数に名前を付ける必要がないという事実は、それらを説明するための別の名前のソースです:「無名関数」。

また、ラムダステートメントは、作成した関数への参照を返すという点で関数呼び出しに似ていることに注意してください。以下は違法です。

apply_to_each(def foo(x): x**2 ,  range(0, 101))

一方、 apply_to_each(lambda x: x**2 range(0, 101))大丈夫です。

そこで、我々は、使用lambdaの代わりに、def_私たちは短い、甘い何かをしたいと、おそらく後で再利用したくないとき代わりに、長い変数名の。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.