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?
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 .
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
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