Comprendere lambda in python e usarlo per passare più argomenti


90

Dopo aver letto tutto quello che posso trovare su lambda, ancora non capisco come fargli fare quello che voglio.

Tutti usano l'esempio:

lambda x, y : x + y

Perché è necessario dichiarare entrambi xe yprima del :? Inoltre, come fai a restituire più argomenti?

per esempio:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

Funziona benissimo. Ma il codice seguente non lo fa:

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

Restituisce l'errore:

TypeError: () non accetta argomenti (1 dato)

Risposte:


136

Perché è necessario indicare sia "x" che "y" prima di ":"?

Perché un lambda è (concettualmente) uguale a una funzione, solo scritto in linea. Il tuo esempio è equivalente a

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

solo senza associarlo a un nome come f.

Inoltre, come fai a restituire più argomenti?

Allo stesso modo come con una funzione. Preferibilmente, restituisci una tupla:

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

O un elenco, o una classe, o qualsiasi altra cosa.

La cosa con self.entry_1.binddovrebbe essere risolta da Demosthenex.


2
Per ottenere davvero il minimo da loro, potresti provare un po 'di programmazione funzionale, che è un'esperienza fantastica quando inizi a capirlo, e probabilmente ti renderà un programmatore migliore. </propaganda>
phipsgabler

3
Sei il mio dio e la tua propaganda è il mio pane quotidiano. Tuttavia, ho provato ad applicarlo su una tupla: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))e sembra che non funzioni. Per favore, salva la mia anima dalla nebbia della programmazione procedurale
Revolucion per Monica

@RevolucionforMonica Risposta un po 'tardiva, ma ecco un esempio di codice REPL Python 3 su come farlo: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

Credo che bind cerchi sempre di inviare un parametro di evento. Provare:

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

Accetti il ​​parametro e non lo usi mai.


omg, ci stavo lavorando da così tanto tempo e poi ho ricevuto una risposta funzionante in 1 min flat ... Btw, sai perché le cose vanno davanti ai due punti?
Talisin

2
Perché sono parametri di funzionamento .
phipsgabler

3
Puoi anche provare "event = None" per dargli un valore predefinito, quindi la funzione può essere utilizzata per bind e il pulsante.
Demosthenex

5

Perché è necessario dichiarare entrambi xe yprima del :?

Perché è una definizione di funzione e ha bisogno di sapere quali parametri accetta la funzione e in quale ordine. Non può semplicemente guardare l'espressione e usare i nomi delle variabili in quella, perché alcuni di quei nomi potresti voler usare valori di variabili locali o globali esistenti, e anche se lo facesse, non saprebbe in che ordine dovrebbe aspettarsi di ottenerli.

Il tuo messaggio di errore significa che Tk sta chiamando il tuo lambda con un argomento, mentre il tuo lambda è scritto per non accettare argomenti. Se non hai bisogno dell'argomento, accettane uno e non usarlo. ( Demosthenex ha il codice , l'avrei pubblicato ma ci sono stato battuto.)


Grazie per la spiegazione. Penso di aver finalmente capito la cosa.
Talisin

3

Perché è necessario indicare sia "x" che "y" prima di ":"?

Potresti effettivamente in alcune situazioni (quando hai un solo argomento) non mettere la x e la y prima di ":".

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

ma la i nel lambda sarà legata al nome, quindi,

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

diverso da quello che potresti desiderare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.