Понимание лямбда в 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 данный)
Ответы
Ответ 1
Зачем вам нужно указывать "x" и "y" перед ":"?
Поскольку лямбда (концептуально) такая же, как функция, просто написана в строке. Ваш пример эквивалентен
def f(x, y) : return x + y
не привязывая его к имени типа f
.
Также как вы можете вернуть несколько аргументов?
Точно так же, как с функцией. Предпочтительно, вы возвращаете кортеж:
lambda x, y: (x+y, x-y)
Или список, или класс, или что-то еще.
На предмет с self.entry_1.bind
должен ответить Demosthenex.
Ответ 2
Я считаю, что bind всегда пытается отправить параметр события. Попробуйте:
self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
Вы принимаете параметр и никогда не используете его.
Ответ 3
Зачем вам нужно указывать "x" и "y" перед ":"?
Потому что это определение функции, и ему нужно знать, какие параметры принимает функция, и в каком порядке. Он не может просто взглянуть на выражение и использовать имена переменных в этом, потому что некоторые из этих имен вы можете использовать существующие локальные или глобальные значения переменных, и даже если бы это произошло, он не знал бы, должен ожидать их получения.
Ваше сообщение об ошибке означает, что Tk вызывает ваш лямбда с одним аргументом, в то время как ваша лямбда написана, чтобы не принимать аргументы. Если вам не нужен аргумент, просто примите его и не используйте. (Демосфенокс имеет код, я бы разместил его, но был избит.)
Ответ 4
Зачем вам нужно указывать "x" и "y" перед ":"?
Фактически вы можете в некоторых ситуациях (когда у вас есть только один аргумент) не ставьте x и y перед ":".
>>> flist = []
>>> for i in range(3):
... flist.append(lambda : i)
но я в lambda будет привязано по имени, поэтому
>>> flist[0]()
2
>>> flist[2]()
2
>>>
отличается от того, что вам может понадобиться.