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'