web-dev-qa-db-fra.com

Comprendre lambda dans python et l’utiliser pour passer plusieurs arguments

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

Tout le monde utilise l'exemple:

lambda x, y : x + y

Pourquoi devez-vous indiquer à la fois x et y avant le :? Aussi, comment faites-vous retourner 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 le fait pas:

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

Cela donne l'erreur:

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

74
Talisin

Pourquoi devez-vous indiquer à la fois "x" et "y" avant le ":"?

Parce qu'un lambda est (conceptuellement) identique à une fonction, écrit simplement en ligne. Votre exemple est équivalent à

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

juste sans le lier à un nom comme f.

Aussi, comment faites-vous retourner plusieurs arguments?

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

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

Ou une liste, ou une classe, ou autre chose.

La chose avec self.entry_1.bind devrait être répondu par Demosthenex.

111
phg

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

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.

10
Demosthenex

Pourquoi devez-vous indiquer à la fois x et y avant le :?

Parce que c'est une définition de fonction et qu'il a besoin de savoir quels paramètres sont acceptés par la fonction et dans quel ordre. Il ne peut pas simplement regarder l'expression et utiliser les noms de variables dans celui-ci, car certains de ces noms pour lesquels vous pourriez utiliser des valeurs de variables locales ou globales existantes, et même si cela se produisait, il ne saurait pas dans quel ordre 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 ne pas accepter d'arguments. Si vous n'avez pas besoin de l'argument, acceptez-en un et ne l'utilisez pas. ( Demosthenex a le code , je l'aurais posté mais j'ai été battu.)

5
kindall

Pourquoi devez-vous indiquer à la fois "x" et "y" avant le ":"?

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

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

mais le i dans le lambda sera lié par son nom, alors,

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

différent de ce que vous voudrez peut-être.

3
AlbertoAndreotti