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