Numérique et Sciences Informatiques > Langages de Programmation > Paradigmes de Programmation > Programmation fonctionnelle (notions de base)
Introduction à la Programmation Fonctionnelle
Découvrez les bases de la programmation fonctionnelle, un paradigme puissant et élégant, idéal pour aborder des problèmes complexes avec clarté et concision. Ce guide est spécialement conçu pour les élèves de lycée en Numérique et Sciences Informatiques (NSI).
Qu'est-ce que la programmation fonctionnelle ?
La programmation fonctionnelle est un paradigme de programmation où les programmes sont construits en appliquant et en composant des fonctions. Contrairement à la programmation impérative, qui se concentre sur la modification de l'état du programme à travers des instructions, la programmation fonctionnelle met l'accent sur les expressions et les transformations de données. En programmation fonctionnelle, on évite autant que possible les effets de bord et l'état mutable. Principales caractéristiques:
Fonctions pures
Une fonction pure est le pilier de la programmation fonctionnelle. Elle est définie par deux règles essentielles : Exemple en Python (illustrant une fonction pure et une fonction impure): La fonction
# Fonction pure
def addition(a, b):
return a + b
# Fonction impure (car elle utilise une variable globale)
global_result = 0
def impure_addition(a, b):
global global_result
global_result = a + b
return global_result
# Fonction impure (car elle affiche quelque chose)
def afficher_addition(a, b):
result = a + b
print(f"{a} + {b} = {result}")
return result
print(addition(2, 3)) # Affiche 5
impure_addition(2,3) # Modifie global_result, donc c'est impure.
print(global_result) # Affiche 5
afficher_addition(2, 3) # Affiche 2 + 3 = 5
addition
est pure car elle dépend uniquement de a
et b
et ne modifie rien d'autre. Les fonctions impure_addition
et afficher_addition
ne sont pas pures.
Immutabilité
L'immutabilité signifie qu'une fois qu'une donnée est créée, elle ne peut plus être modifiée. Au lieu de modifier une donnée existante, on en crée une nouvelle, basée sur l'ancienne. Exemple en Python (illustrant l'immutabilité des tuples et la mutabilité des listes): En programmation fonctionnelle, on préfère utiliser des structures de données immuables. Si l'on doit modifier une liste, on ne modifie pas la liste existante, mais on crée une nouvelle liste avec les modifications.
# Tuple (immutable)
tuple_exemple = (1, 2, 3)
# tuple_exemple[0] = 4 # Ceci provoquerait une erreur car les tuples sont immutables
# Liste (mutable)
liste_exemple = [1, 2, 3]
liste_exemple[0] = 4 # Ceci est valide, la liste est modifiée
print(liste_exemple) # Affiche [4, 2, 3]
Fonctions de première classe
En programmation fonctionnelle, les fonctions sont traitées comme des valeurs de première classe. Cela signifie qu'elles peuvent être : Cette capacité permet de créer des fonctions d'ordre supérieur, c'est-à-dire des fonctions qui prennent d'autres fonctions en argument ou qui retournent des fonctions. Exemple en Python : Dans cet exemple,
def appliquer_operation(fonction, a, b):
return fonction(a, b)
def addition(a, b):
return a + b
def multiplication(a, b):
return a * b
resultat_addition = appliquer_operation(addition, 5, 3) # resultat_addition vaut 8
resultat_multiplication = appliquer_operation(multiplication, 5, 3) # resultat_multiplication vaut 15
print(resultat_addition)
print(resultat_multiplication
appliquer_operation
est une fonction d'ordre supérieur qui prend une autre fonction (addition
ou multiplication
) en argument.
Récursion
La récursion est une technique de programmation où une fonction s'appelle elle-même pour résoudre un problème. C'est une alternative aux boucles ( Pour éviter une boucle infinie, une fonction récursive doit avoir une condition d'arrêt, c'est-à-dire une condition qui, lorsqu'elle est remplie, arrête les appels récursifs. Exemple en Python (calcul de la factorielle d'un nombre) : Dans cet exemple, la fonction for
, while
) en programmation impérative.
def factorielle(n):
if n == 0:
return 1 # Condition d'arrêt
else:
return n * factorielle(n - 1) # Appel récursif
print(factorielle(5)) # Affiche 120
factorielle
s'appelle elle-même avec un argument plus petit jusqu'à ce que n
soit égal à 0. La condition n == 0
est la condition d'arrêt.
Avantages de la programmation fonctionnelle
La programmation fonctionnelle offre plusieurs avantages :
Exemple concret : Calcul de la somme des carrés des nombres pairs d'une liste
Voici un exemple qui illustre plusieurs concepts de la programmation fonctionnelle en Python. Explication:
def est_pair(n):
return n % 2 == 0
def carre(n):
return n * n
def somme_carres_pairs(liste_nombres):
# Filtrer les nombres pairs
nombres_pairs = list(filter(est_pair, liste_nombres))
# Calculer le carré de chaque nombre pair
carres_pairs = list(map(carre, nombres_pairs))
# Calculer la somme des carrés
somme = sum(carres_pairs)
return somme
liste_exemple = [1, 2, 3, 4, 5, 6]
resultat = somme_carres_pairs(liste_exemple)
print(resultat) # Affiche 56 (2^2 + 4^2 + 6^2 = 4 + 16 + 36 = 56)
est_pair
et carre
sont des fonctions pures.filter
et map
sont des fonctions d'ordre supérieur.somme_carres_pairs
utilise ces fonctions pour réaliser le calcul de manière claire et concise.
Ce qu'il faut retenir
FAQ
-
Quelle est la différence entre programmation fonctionnelle et programmation impérative ?
La programmation impérative se concentre sur la modification de l'état du programme en exécutant des instructions étape par étape, tandis que la programmation fonctionnelle se concentre sur l'application et la composition de fonctions sans modifier l'état du programme. -
Est-ce que la programmation fonctionnelle est plus difficile que la programmation impérative ?
Cela dépend de l'expérience et des préférences de chacun. La programmation fonctionnelle peut sembler plus abstraite au début, mais elle peut conduire à un code plus clair et plus facile à maintenir à long terme. -
Quels sont les langages de programmation qui supportent la programmation fonctionnelle ?
De nombreux langages de programmation supportent la programmation fonctionnelle, notamment Python, JavaScript, Haskell, Lisp, Clojure, Scala, et F#.