2012-04-27 17 views
53

Después de leer todo lo que puedo encontrar en lambda, todavía no entiendo cómo hacer que haga lo que quiero.Entender lambda en python y usarlo para pasar argumentos múltiples

Todo el mundo utiliza el ejemplo:

lambda x, y : x + y 

¿Por qué necesita para indicar tanto x y y antes de la :? ¿También cómo haces 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 muy bien. Pero el siguiente código no:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1)) 

Se produce el error:

TypeError:() takes no arguments (1 given)

Respuesta

87

Why do you need to state both 'x' and 'y' before the ':'?

Debido a que una lambda es (conceptualmente) la misma función, justo en línea escrita. Su ejemplo es equivalente al

def f(x, y) : return x + y 

solo que sin enlazarlo a un nombre como f.

Also how do you make it return multiple arguments?

Igual que con una función. Preferiblemente, devuelve una tupla:

lambda x, y: (x+y, x-y) 

O una lista, o una clase, o lo que sea.

Demosthenex debe responder al asunto con self.entry_1.bind.

+2

Para sacarles el mayor provecho posible, puede probar alguna programación funcional, que es una experiencia increíble cuando la empiezas a entender, y probablemente te haga un mejor programador. – phg

9

Creo que se unen siempre trata de enviar un parámetro de evento. Pruebe:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1)) 

Acepta el parámetro y nunca lo usa.

+0

omg, he estado trabajando en eso por tanto tiempo y luego recibo una respuesta que funciona en 1 minuto llano ... Por cierto, ¿sabes por qué las cosas van delante de los dos puntos? – Talisin

+2

Porque son _funcion parámetros_. – phg

+2

También puede probar "event = None" para darle un valor predeterminado, luego la función se puede usar para bind y el botón. – Demosthenex

5

Why do you need to state both x and y before the : ?

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 podrían querer usar valores de variables locales o globales existentes, e incluso si lo hiciera, no sabría qué orden debería esperar obtenerlos.

Su mensaje de error significa que Tk está llamando a su lambda con un argumento, mientras que su lambda está escrita para no aceptar ningún argumento. Si no necesita el argumento, simplemente acepte uno y no lo use. (Demosthenex has the code, lo habría publicado, pero fue adelantado.)

+0

Gracias por la explicación. Creo que finalmente estoy entendiendo esto. – Talisin

2

Why do you need to state both 'x' and 'y' before the ':'?

en realidad se podría en algunas situaciones (cuando se tiene sólo un argumento) no ponga la X e Y antes ":".

>>> flist = [] 
>>> for i in range(3): 
...  flist.append(lambda : i) 

pero el i en el lambda estará obligado por nombre, por lo que,

>>> flist[0]() 
2 
>>> flist[2]() 
2 
>>> 

diferente de lo que es posible que desee.

Cuestiones relacionadas