次のコードは何をしますか?
a = lambda _:True
インタラクティブプロンプトで読んでテストしたところ、常にを返す関数のようTrue
です。
私はこれを正しく理解していますか?アンダースコア(_
)も使用された理由を理解したいと思います。
次のコードは何をしますか?
a = lambda _:True
インタラクティブプロンプトで読んでテストしたところ、常にを返す関数のようTrue
です。
私はこれを正しく理解していますか?アンダースコア(_
)も使用された理由を理解したいと思います。
_
は、x
ora
などではなく、たまたま奇妙な名前を持っています。引数を取らないラムダ関数の書き方を知りたい人がいたら、方法は次のとおりmy_lambda = lambda : 255
です。次のように定義します。このように呼んでx = my_lambda()
ください:あなたは255
好きな戻り値で置き換えることができます。
回答:
_
変数名です。それを試してみてください。(この変数名は通常、無視される変数の名前です。いわばプレースホルダーです。)
Python:
>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'
>>> l("foo")
True
したがって、このラムダには1つの引数が必要です。常にを返す引数のないラムダが必要な場合はTrue
、次のようにします。
>>> m = lambda: True
>>> m()
True
Python 3.6.2
の下Mac OS 10.12
、それが動作します。
_
変数自体が実際には必要ない場合に、変数名が一般的に使用されるという情報を追加できるかもしれません。これは「使い捨て変数」のようなもので、役に立たない単なるプレースホルダーです。
アンダースコアは、未使用の変数に名前を付けるためのPythonの規則です(たとえば、静的分析ツールは未使用の変数として報告しません)。あなたの場合、ラムダ引数は使用されていませんが、作成されたオブジェクトは常にを返す単一引数関数True
です。したがって、ラムダは数学の定数関数にいくぶん似ています。
関係なくTrueを返す関数のようです。
はい、それはTrueを返す関数(またはラムダ)です。アンダー通常無視変数のプレースホルダーであり、この場合には不要です。
このような関数のユースケースの例(ほとんど何もしません):
dd = collections.defaultdict(lambda: True)
defaultdictの引数として使用する場合True
、一般的なデフォルト値として使用できます。
アンダースコア_
は有効な識別子であり、ここでは変数名として使用されます。True
関数に渡された引数に対して常に戻ります。
>>>a('123')
True
問題のコード行は次のとおりです。
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ステートメントで同じことを行うのは難しいことに注意してください。使用する別の理由lambda
def
関数が再度使用されない場合に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
と_
私たちは短い、甘い何かをしたいと、おそらく後で再利用したくないとき代わりに、長い変数名の。
lambda : True