Pythonでラムダを理解し、それを使用して複数の引数を渡す


90

ラムダで見つけることができるすべてを読んだ後、私はまだそれを私が望むことをさせる方法を理解していません。

誰もが例を使用します:

lambda x, y : x + y

なぜあなたは両方xy前に述べる必要があるの:ですか?また、どのようにして複数の引数を返すようにしますか?

例えば:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

これは問題なく機能します。しかし、次のコードはそうではありません:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

エラーが発生します:

TypeError :()は引数を取りません(1つ指定)

回答:


135

':'の前に 'x'と 'y'の両方を記述する必要があるのはなぜですか?

ラムダは(概念的に)関数と同じであるため、インラインで記述されます。あなたの例は

def f(x, y) : return x + y

のような名前にバインドせずにf

また、どのようにして複数の引数を返すようにしますか?

関数と同じように。できれば、タプルを返します。

lambda x, y: (x+y, x-y)

またはリスト、またはクラス、または何でも。

とのことはself.entry_1.bindDemosthenexによって答えられるべきです。


2
それらを実際に
最小限に抑える

3
あなたは私の神であり、あなたの宣伝は私の毎日のパンです。それでも、タプルに適用しようとしました:(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))そしてそれは機能しないようです。手続き型プログラミングの霧から私の魂を救ってください
モニカのためのRevolucion

@RevolucionforMonica返信が少し遅れましたが、これを行う方法のPython 3 REPLコード例を次に示します。repl.it
Mass Dot Net

11

bindは常にイベントパラメータを送信しようとすると思います。試してみてください:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

パラメータを受け入れ、決して使用しないでください。


ああ、私は長い間それに取り組んできました、そしてそれから私は1分フラットで実用的な答えを得ます...ところで、なぜ物事がコロンの前に行くのか知っていますか?
タリアセン2012

2
それらは機能パラメータであるため。
phipsgabler 2012

3
「event = None」を試してデフォルト値を指定することもできます。その後、この関数をバインドとボタンに使用できます。
Demosthenex 2012

5

なぜあなたは両方xy前に述べる必要があるの:ですか?

これは関数定義であり、関数が受け入れるパラメーターとその順序を知る必要があるためです。式を調べてその中で変数名を使用することはできません。既存のローカル変数またはグローバル変数の値を使用したい名前があるため、それを行ったとしても、その順序がわからないためです。それらを取得することを期待する必要があります。

エラーメッセージは、Tkが1つの引数でラムダを呼び出しているのに対し、ラムダは引数を受け入れないように記述されていることを意味します。引数が必要ない場合は、引数を受け入れて使用しないでください。(Demosthenexにはコードがあります、私はそれを投稿したでしょうが、それに殴られました。)


説明してくれてありがとう。私はついにこれに頭を悩ませていると思います。
タリアセン2012

3

':'の前に 'x'と 'y'の両方を記述する必要があるのはなぜですか?

実際には、状況によっては(引数が1つしかない場合)、「:」の前にxとyを付けないことがあります。

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

ただし、ラムダのiは名前でバインドされるため、

>>> flist[0]()
2
>>> flist[2]()
2
>>>

あなたが望むかもしれないものとは異なります。

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