124 votes

Comprendre le lambda en python et l'utiliser pour passer des arguments multiples

Après avoir lu tout ce que je peux trouver sur lambda, je ne comprends toujours pas comment lui faire faire ce que je veux.

Tout le monde utilise l'exemple :

lambda x, y : x + y

Pourquoi est-il nécessaire d'indiquer les deux x y y avant le : ? Et comment faire pour qu'il renvoie plusieurs arguments ?

par exemple :

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

Cela fonctionne très bien. Mais le code suivant ne fonctionne pas :

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

Il produit l'erreur :

TypeError : () ne prend aucun argument (1 donné)

174voto

phg Points 4168

Pourquoi faut-il indiquer à la fois "x" et "y" avant le " :"?

Parce qu'une lambda est (conceptuellement) la même chose qu'une fonction, juste écrite en ligne. Votre exemple est équivalent à

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

sans le lier à un nom comme f .

Comment faire pour qu'il renvoie plusieurs arguments ?

De la même manière que pour une fonction. De préférence, vous retournez un tuple :

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

Ou une liste, ou une classe, ou n'importe quoi d'autre.

Le problème avec self.entry_1.bind devrait être répondu par Demosthenex.

13voto

Demosthenex Points 1847

Je crois que bind essaie toujours d'envoyer un paramètre d'événement. Essayez :

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

Vous acceptez le paramètre et ne l'utilisez jamais.

7voto

kindall Points 60645

Pourquoi est-il nécessaire d'indiquer les deux x y y avant le : ?

Parce qu'il s'agit d'une définition de fonction et qu'il faut savoir quels paramètres la fonction accepte, et dans quel ordre. Elle ne peut pas se contenter de regarder l'expression et d'utiliser les noms des variables, parce que certains de ces noms pourraient nécessiter l'utilisation de valeurs de variables locales ou globales existantes, et même si elle le faisait, elle ne saurait pas dans quel ordre elle devrait s'attendre à les obtenir.

Votre message d'erreur signifie que Tk appelle votre lambda avec un argument, alors que votre lambda est écrit pour n'accepter aucun argument. Si vous n'avez pas besoin de l'argument, acceptez-en un et ne l'utilisez pas. ( Demosthenex a le code Je l'aurais bien posté, mais j'ai été devancé.)

4voto

AlbertoAndreotti Points 364

Pourquoi faut-il indiquer à la fois "x" et "y" avant le " :"?

Dans certaines situations (lorsque vous n'avez qu'un seul argument), vous pouvez ne pas mettre les x et les y avant " :".

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

mais le i dans le lambda sera lié par le nom, donc,

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

différent de ce que vous souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X