Después de leer todo lo que puedo encontrar en lambda, todavía no entiendo cómo hacer que haga lo que quiero.
Todos usan el ejemplo:
lambda x, y : x + y
¿Por qué necesita indicar ambos x
y y
antes del :
? Además, ¿cómo se hace que devuelva múltiples argumentos?
por ejemplo:
self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
Esto funciona bien. Pero el siguiente código no:
self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
Produce el error:
TypeError: () no acepta argumentos (1 dado)
fuente
(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))
y parece que no funciona. Por favor, salva mi alma de la niebla de la programación procedimentalCreo que bind siempre intenta enviar un parámetro de evento. Tratar:
self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
Acepta el parámetro y nunca lo usa.
fuente
Porque es una definición de función y necesita saber qué parámetros acepta la función y en qué orden. No puede simplemente mirar la expresión y usar los nombres de las variables en eso, porque algunos de esos nombres para los que es posible que desee usar valores de variables locales o globales existentes, e incluso si lo hiciera, no sabría en qué orden debería esperar conseguirlos.
Su mensaje de error significa que Tk está llamando a su lambda con un argumento, mientras que su lambda está escrito para no aceptar argumentos. Si no necesita el argumento, simplemente acepte uno y no lo use. ( Demosthenex tiene el código , lo habría publicado, pero me ganaron).
fuente
De hecho, en algunas situaciones (cuando solo tiene un argumento) podría no poner xey antes de ":".
>>> flist = [] >>> for i in range(3): ... flist.append(lambda : i)
pero la i en la lambda estará vinculada por el nombre, entonces,
>>> flist[0]() 2 >>> flist[2]() 2 >>>
diferente de lo que puede desear.
fuente