Pourquoi dans le code suivant, la sortie est 22?
Dans ma compréhension, nous avons une fonction qui a besoin de deux arguments, mais elle a été définie avec un seul! Cependant, la première fois que nous l'utilisons dans mydoubler = myfunc (2)
, il affecte l'argument (2) à la variable n
, mais la deuxième fois nous l'utilisons dans print (mydoubler (11) , il utilise l'argument (11) pour définir la valeur de la variable a
! Pourquoi? Lambda fonctionne-t-il comme une fonction récursive? p>
def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) print(mydoubler(11))
4 Réponses :
lambda a: a * n est identique à:
def somefunction(a): return a * 2
Lorsque vous avez appelé myfunc (2), vous avez créé dynamiquement une fonction identique à:
def somefunction(a): return a * n
myfunc
renvoie une fonction. Donc mydoubler
est une fonction et est décrit par lamda a: a * 2
. Ensuite, vous appelez cette fonction avec l'argument 22 et donc naturellement 11 * 2 = 22 est affiché. Les fonctions Lambda ne sont pas en soi récursives, elles sont juste une manière plus courte d'écrire une fonction simple. Dans votre cas, vous pouvez également écrire:
def myfunc(n): def multiplier(a): return a * n return multiplier
En gros, voici ce qui se passe:
mydoubler = myfunc (2)
équivaut en fait à écrire mydoubler = lambda a: a * 2
La raison en est que myfunc (2)
renvoie lambda a: a * 2
Alors maintenant mydoubler = lambda a: a * 2
Ensuite, lorsque mydoubler (11)
est appelé, il renvoie simplement 11 * 2
Vous retournez un lambda, qui est une fonction à une seule ligne, PAS un nombre. Le code ci-dessous fait exactement la même chose, mais est peut-être un peu plus clair quant à son objectif:
def multiplier_factory(constant_factor): # Define our new function def multiplier(factor): result = constant_factor * factor return result # Return the FUNCTION, not a number return multiplier doubler = multiplier_factory(2) tripler = multiplier_factory(3) print (doubler(1)) # prints 2 print (tripler(1)) # prints 3 print (doubler('a')) # prints 'aa' print (tripler('a')) # prints 'aaa'