Подтвердить что ты не робот

Понимание лямбда в 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 данный)

4b9b3361

Ответ 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
>>>

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