5.1. La programmation fonctionnelle

La programmation fonctionnelle est un paradigme de programmation qui se distingue de la programmation procédurale ou orientée objet en considérant le calcul en tant qu’évaluation de fonctions mathématiques. En effet, alors que la programmation orientée objet seconde prône l’utilisation de classes pour structurer les données à un haut niveau d’abstraction en créant des types complexes, la programmation fonctionnelle favorise l’assemblage de fonctions simples pour réaliser des tâches complexes. Les fonctions sont considérées aussi bien comme des données que comme des entités permettant de les produire. En effet, puisque les fonctions sont des objets, il est possible de les stocker dans des variables, les transmettre comme paramètres d’autres fonctions et de les utiliser comme valeurs de retour.

Le code ci-dessous illustre le principe de la programmation fonctionnelle en combinant des opérations arithmétiques sur des valeurs numériques. On constate qu’il est aisé de passer des fonctions en paramètres et de les composer entre elles.

def calc(f, x, y):  # la fonction prend une autre fonction `f` en paramètre
    return f(x, y)  # on renvoie la valeur de `f` appliquée à `x` et `y`


def add(x, y):
    return x + y


def mul(x, y):
    return x * y


# addition et multiplication de valeurs combinant les functions
print(calc(add, 10, 20))
print(calc(mul, 10, 20))
30
200

Une différence notable entre la programmation procédurale ou orientée objet et la programmation fonctionnelle est la tendance accentuée à remplacer les boucles par des fonctions récursives ou des générateurs, lorsque c’est possible. La fonction de calcul de la suite de Fibonacci ci-dessous est un exemple classique de l’utilisation de la récursivité pour remplacer un boucle.

def fib(n):
    return 1 if n < 2 else fib(n - 1) + fib(n - 2)

Note

Comme la programmation orientée objet, la programmation fonctionnelle est simplement une façon d’organiser les instructions et les données d’un programme, avec ses avantages et ses inconvénients. Ce style de programmation est particulièrement adapté pour les problèmes de calcul proches des mathématiques ou de l’algorithmique, pour lesquels il permet de développer du code simple et élégant. Il n’est cependant pas strictement plus ou moins puissant que les autres paradigmes de la programmation.