1
votes

Une question concernant la fonction Lambda en Python

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))


0 commentaires

4 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

1
votes

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


0 commentaires

1
votes

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'


0 commentaires