2
votes

Fonction comme argument d'une autre fonction

J'apprends ce langage, donc je suis nouveau avec Python. Le code est:

def add(a, b):
    return a + b

def double_add(x, a, b):
    return x(x(a, b), x(a, b))

a = 4
b = 5
print(double_add(add, a, b))  

La fonction add est simple, elle ajoute deux nombres. La fonction double_add a trois arguments. Je comprends ce qui se passe (avec quelques doutes). Le résultat est 18 . Je ne comprends pas comment double_add utilise add pour fonctionner.

La question est, quel est le lien entre ces deux fonctions?

Il serait utile de me donner quelques exemples d'utilisation d'une fonction comme argument d'une autre fonction.
Merci d'avance.


1 commentaires

La fonction add est passée en tant que x . x (a, b) est fondamentalement add (a, b)


7 Réponses :


4
votes

En langage python , les fonctions (et méthodes) sont objets de première classe . Les objets First Class sont ces objets qui peuvent être traités de manière uniforme.

Donc, il vous suffit de passer une méthode comme argument .

Votre méthode renverra add (add (4, 5), add (4, 5)) qui est add (9, 9) et est égal à < code> 18 .


0 commentaires

0
votes

L'objet fonction add est passé en argument à double_add , où il est localement appelé x . x est alors appelé sur chacun, puis sur les deux valeurs de retour de celui-ci.


0 commentaires

1
votes

Les Les fonctions sont des objets en Python, comme tout autre élément tel que des listes, des chaînes .. et vous pouvez les transmettre de la même manière que vous le faites avec les variables.


0 commentaires

1
votes

Si vous ajoutiez print (x) dans la fonction double_add , vous verriez qu'elle afficherait . Par conséquent, le code de double_add est fondamentalement le même que si vous faisiez ce qui suit:

print(add(add(a,b), add(a,b))) # returns 18 in your case


0 commentaires

-1
votes

Voici un exemple très simple de ce que l'on appelle une "injection de dépendances". Cela signifie que vous ne définissez pas explicitement une interaction entre les deux fonctions, vous définissez plutôt que double_add devrait utiliser une fonction, mais il ne sait ce que c'est que lorsque le code est réellement exécuté. (Au moment de l'exécution, vous injectez la dépendance sur une fonction spécifique, au lieu de la coder en dur dans la fonction elle-même),

Essayez par exemple ce qui suit

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def double_add(x, a, b):
    return x(x(a, b), x(a, b))

a = 4
b = 5

print(double_add(add, a, b))  
print(double_add(subtract, a, b))  

En d'autres termes, double_add est devenu une fonction générique qui exécutera ce que vous lui donnerez deux fois et affichera le résultat


0 commentaires

0
votes
result1 = add(a, b)
result2 = add(a, b)
return add(result1, result2)

0 commentaires

1
votes

Une fonction est un objet comme n'importe quel autre en Python. Vous pouvez donc le passer comme argument, lui attribuer des attributs, et peut-être le plus important - l'appeler. Nous pouvons regarder un exemple plus simple pour comprendre comment le passage d'une fonction fonctionne:

return x(x(a, b), x(a, b))

Et ceci imprime:

9
-1
4 5

C'est parce que dans chaque cas, func est assigné avec l ' objet fonction respectif passé en argument, puis en faisant func (a, b) il en fait appelle cette fonction sur les arguments donnés.


Alors que se passe-t-il avec votre ligne:

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def operate(func, a, b):
    return func(a, b)

a = 4
b = 5
print(operate(add, a, b))  
print(operate(sub, a, b))
operate(print, a, b)

est d'abord les deux x (a, b) sont évalués comme add (4, 5) ce qui donne 9 . Et puis le x (...) extérieur est évalué comme add (9, 9) qui donne 18 .

p>


1 commentaires

" C'est parce que dans chaque cas, func est assigné avec l'objet de fonction respectif, puis quand on fait func (a, b) il appelle réellement cette fonction sur les arguments donnés. ", cette ligne est ce que Je cherchais. Merci pour l'explication claire.