Понимание лямбда в 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 ответа:
почему вам нужно указать оба '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 >>>
отличается от того, что вам может понадобиться.