Compte tenu de ce code:

sumThree = lambda (x, y, z): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])
print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree((1, 2), (3, 4), (5, 6)))

Je reçois:

TypeError                                 Traceback (most recent call last)
<ipython-input-43-7f1b9571e230> in <module>()
     16 # second position summed. E.g. (1, 2), (3, 4), (5, 6) => (1 + 3 + 5, 2 + 4 + 6) => (9, 12)
     17 sumThree = lambda (x0, x1, x2): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])
---> 18 print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree((1, 2), (3, 4), (5, 6)))

TypeError: <lambda>() takes exactly 1 argument (3 given)

Et la question est bien sûr, pourquoi?

5
IttayD 16 juil. 2015 à 10:25

2 réponses

Meilleure réponse

Vous pouvez soit supprimer les crochets autour des arguments lambda:

sumThree = lambda x, y, z: (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])

Ou sinon passez les arguments en tant que tuple unique au lambda d'origine:

print 'sumThree((1, 2), (3, 4), (5, 6)) = {0}'.format(sumThree(((1, 2), (3, 4), (5, 6))))
9
YS-L 16 juil. 2015 à 07:28

Vous avez créé une fonction lambda qui prend un argument: le tuple (x, y, z). Si vous appelez votre fonction avec un tuple comme seul argument, cela fonctionnera:

sumThree(((1, 2), (3, 4), (5, 6)))

Vous pouvez également réécrire la fonction lambda pour ne pas prendre un argument de tuple, mais trois arguments:

sumThree = lambda (x, y, z): (x[0]+ y[0] + z[0], x[1] + y[1] + z[1])

Notez également que c'est une bonne pratique de codage de définir simplement des fonctions nommées (c'est-à-dire def sumThree(x, y, z):). Utiliser une fonction lambda et l'assigner à une variable (sumThree) annule le seul avantage que les lambdas ont sur les fonctions régulières: que vous n'avez pas besoin de les pousser dans une variable.

1
acdr 16 juil. 2015 à 08:06