web-dev-qa-db-ja.com

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

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

全員が例を使用します。

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が与えられます)

74
Talisin

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

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

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

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

また、複数の引数を返すようにするにはどうすればよいですか?

関数と同じ方法。できれば、タプルを返します:

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

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

self.entry_1.bindのあるものはDemosthenexによって回答されるべきです。

111
phg

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

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

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

10
Demosthenex

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

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

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

5
kindall

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

実際には、いくつかの状況(引数が1つしかない場合)では、「:」の前にxとyを付けないでください。

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

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

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

あなたが望むものとは異なります。

3