web-dev-qa-db-fra.com

Comment écrire une fonction qui retourne une autre fonction?

En Python, j'aimerais écrire une fonction make_cylinder_volume(r) qui retourne une autre fonction. Cette fonction retournée devrait être appelable avec le paramètre h et renvoyer le volume d'un cylindre de hauteur h et de rayon r.

Je sais comment retourner valeurs à partir de fonctions en Python, mais comment puis-je retourner ne autre fonction?

66
Julian Das

Essayez ceci en utilisant Python:

import math
def make_cylinder_volume_func(r):
    def volume(h):
        return math.pi * r * r * h
    return volume

Utilisez-le comme ceci, par exemple avec radius=10 et height=5:

volume_radius_10 = make_cylinder_volume_func(10)
volume_radius_10(5)
=> 1570.7963267948967

Notez que pour renvoyer une fonction, il suffisait de définir une nouvelle fonction à l'intérieur de la fonction et de la renvoyer à la fin - en prenant soin de transmettre les paramètres appropriés pour chaque fonction. Pour votre information, la technique permettant de renvoyer une fonction d’une autre fonction est appelée currying .

145
Óscar López

En utilisant lambdas, également connu sous le nom de fonctions anonymes, vous pouvez extraire la fonction volume à l’intérieur du make_cylinder_volume_func sur une seule ligne. En aucun cas différent de la réponse de Óscar López, la solution utilisant lambda est toujours dans un sens "plus fonctionnelle".

Voici comment écrire la réponse acceptée en utilisant une expression lambda:

import math
def make_cylinder_volume_fun(r):
    return lambda h: math.pi * r * r * h

Et appelez ensuite comme n'importe quelle autre fonction au curry:

volume_radius_1 = make_cylinder_volume_fun(1)
volume_radius_1(1) 
=> 3.141592653589793
12
DaveIdito

Je veux juste souligner que vous pouvez le faire avec pymonad

 import pymonad 

 @pymonad.curry
 def add(a, b):
     return a + b

 add5 = add(5)
 add5(4)
 9
10
Erotemic