Понимание лямбда в python и использование его для передачи нескольких аргументов


прочитав все, что я могу найти на лямбда, я все еще не понимаю, как заставить его делать то, что я хочу.

все используют пример:

lambda x, y : x + y

почему вам нужно указать оба x и y до :? Также как вы заставляете его возвращать несколько аргументов?

например:

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 60

4 ответа:

почему вам нужно указать оба 'x' и 'y' перед ':'?

потому что лямбда (концептуально) то же самое, что и функция, просто написанная inline. Ваш пример эквивалентен

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

просто не привязывая его к имени, как f.

также как вы заставляете его возвращать несколько аргументов?

так же, как с функцией. Предпочтительно, вы возвращаете кортеж:

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

или a список, или класс, или что-то еще.

С self.entry_1.bind должен ответить Демосфенекс.

Я считаю, что bind всегда пытается отправить параметр события. Попробуйте:

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

вы принимаете параметр и не использовать его.

Почему вам нужно указать оба x и y до :?

потому что это определение функции, и она должна знать, какие параметры принимает функция, и в каком порядке. Он не может просто посмотреть на выражение и использовать имена переменных в этом, потому что некоторые из этих имен вы можете использовать существующие локальные или глобальные значения переменных, и даже если бы это было так, он не знал бы, какой порядок он должен ожидать их.

ваше сообщение об ошибке означает, что Tk вызывает вашу лямбду с одним аргументом, в то время как ваша лямбда записывается, чтобы не принимать никаких аргументов. Если вам не нужен аргумент, просто примите его и не используйте. (Demosthenex имеет код, Я бы отправил его, но был избит до него.)

почему вам нужно указать оба 'x' и 'y' перед ':'?

вы могли бы на самом деле в некоторых ситуациях(когда у вас есть только один аргумент) не ставить x и y перед ":".

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

но я в лямбде будет связан по имени, так что,

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

отличается от того, что вам может понадобиться.