Implémenter la composition de fonctions en Python
Utilisation de fonctions d'ordre supérieur
En Python, vous pouvez implémenter la composition de fonctions en utilisant des fonctions d'ordre supérieur telles que map(), reduce() ou functools.reduce(). Ces fonctions vous permettent de passer d'autres fonctions en tant qu'arguments, ce qui les rend bien adaptées à la composition de fonctions.
Voici un exemple d'utilisation de map() pour composer deux fonctions :
def square(x):
return x ** 2
def add_one(x):
return x + 1
composed_function = lambda x: add_one(square(x))
result = list(map(composed_function, [1, 2, 3, 4, 5]))
print(result) ## Output: [2, 5, 10, 17, 26]
Dans cet exemple, nous définissons deux fonctions, square et add_one, puis nous créons une nouvelle fonction composed_function qui élève d'abord l'entrée au carré, puis ajoute 1 au résultat. Nous utilisons ensuite map() pour appliquer la fonction composée à une liste de nombres.
Alternativement, vous pouvez utiliser functools.reduce() pour implémenter la composition de fonctions :
from functools import reduce
def square(x):
return x ** 2
def add_one(x):
return x + 1
composed_function = lambda x: reduce(lambda acc, f: f(acc), [square, add_one], x)
result = [composed_function(i) for i in [1, 2, 3, 4, 5]]
print(result) ## Output: [2, 5, 10, 17, 26]
Dans cet exemple, nous utilisons reduce() pour appliquer les fonctions square et add_one séquentiellement à la valeur d'entrée. La fonction reduce() prend une liste de fonctions et une valeur initiale, et applique chaque fonction à l'accumulateur tour à tour.
Utilisation de operator.compose()
Le module functools de Python fournit également la fonction compose(), qui peut rendre la composition de fonctions plus concise :
from functools import compose
def square(x):
return x ** 2
def add_one(x):
return x + 1
composed_function = compose(add_one, square)
result = [composed_function(i) for i in [1, 2, 3, 4, 5]]
print(result) ## Output: [2, 5, 10, 17, 26]
Dans cet exemple, nous utilisons la fonction compose() pour créer une nouvelle fonction qui applique d'abord square, puis add_one au résultat.
Applications pratiques de la composition de fonctions
La composition de fonctions peut être une technique puissante pour construire un code complexe, modulaire et réutilisable. Certaines applications pratiques incluent :
- Pipelines de transformation de données : La composition de fonctions peut être utile pour construire des pipelines de transformation de données, où chaque fonction effectue une étape spécifique de manipulation de données.
- Modèles de programmation fonctionnelle : La composition de fonctions est un concept fondamental en programmation fonctionnelle, et elle peut être utilisée pour implémenter des modèles tels que la fonction
pipe().
- Composition de middleware : Dans les frameworks web comme Flask ou Django, la composition de fonctions peut être utilisée pour créer des middleware qui appliquent une série de transformations à la requête ou à la réponse.
En maîtrisant la composition de fonctions en Python, vous pouvez écrire un code plus maintenable, testable et évolutif.