105

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

誰もが例を使用します:

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つ指定)

4

4 に答える 4

152

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

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

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

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

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

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

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

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

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

于 2012-04-27T05:43:40.427 に答える
13

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

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

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

于 2012-04-27T05:38:03.043 に答える
6

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

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

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

于 2012-04-27T05:43:06.560 に答える
4

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

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

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

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

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

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

于 2014-04-17T22:36:14.233 に答える