Programmation fonctionnelle
I. Les paradigmes impĂ©ratif et fonctionnelâïž
Objectifs
- Comprendre la notion de paradigme de programmation
- Comprendre les notions de paradigme impératif et de paradigme fonctionnel
- Utiliser le paradigme impératif et le paradigme fonctionnel en Python
A savoir
- Un paradigme de programmation est la maniĂšre de formuler le traitement informatique de la rĂ©solution dâun problĂšme.
- Le paradigme impĂ©ratif consiste Ă Ă©crire les instructions des codes les unes Ă la suite des autres dans lâordre de leur exĂ©cution.
- Le paradigme impĂ©ratif autorise lâutilisation des fonctions pour Ă©viter de rĂ©pĂ©ter du code.
- Le paradigme fonctionnel consiste Ă Ă©crire les codes sous la forme dâun ensemble de fonctions.
II. Les paradigmes de programmationâïž
Lorsque lâon veut Ă©crire un programme informatique pour rĂ©soudre un problĂšme, on choisit une maniĂšre dâĂ©crire le code, une maniĂšre de structurer et dâĂ©crire les instructions : on choisit un paradigme de programmation. Un paradigme de programmation est la maniĂšre de formuler le traitement informatique de la rĂ©solution dâun problĂšme.
III. Le paradigme impĂ©ratifâïž
3.1. GĂ©nĂ©ralitĂ©sâïž
Le paradigme de programmation le plus ancien est le paradigme impératif, autrement appelé « programmation impérative ».
Ce paradigme est Ă lâorigine de nombreux langages de programmation tels que les langages C, Pascal ou Basic. Dans un paradigme impĂ©ratif, les instructions sont exĂ©cutĂ©es de maniĂšre sĂ©quentielle, câest-Ă -dire les unes aprĂšs les autres dans lâordre dans lequel elles ont Ă©tĂ© Ă©crites. En programmation impĂ©rative, lâordre dâexĂ©cution du code a de lâimportance.
Ce type de programmation est Ă lâorigine de tous les autres types de programmation et se base sur lâutilisation des structures conditionnelles (if
), des boucles (while
et for
) ainsi que des affectations.
On distingue deux sous-types de paradigmes impĂ©ratifs : le paradigme sĂ©quentiel et le paradigme procĂ©dural. Leur diffĂ©rence tient dans le fait que la programmation procĂ©durale autorise lâusage de fonctions pour rĂ©utiliser du code, alors que la programmation sĂ©quentielle ne lâautorise pas.
On apprend gĂ©nĂ©ralement la programmation en commençant par le paradigme impĂ©ratif. En pratique, lorsque lâon parle de paradigme impĂ©ratif, il sâagit en rĂ©alitĂ© du paradigme procĂ©dural, car lâusage des fonctions est recommandĂ© pour Ă©viter de rĂ©pĂ©ter du code.
3.2. Exemple avec Pythonâïž
Le paradigme impératif est supporté par la plupart des langages de programmation.
Le langage Python est un langage multi-paradigme, qui autorise naturellement la programmation impérative.
Exemple de code en programmation impérative
"""
Code permettant de calculer la moyenne du tableau tab = [1, 2, 3, 4, 5]
"""
tab = [1, 2, 3, 4, 5] # On définit le tableau.
somme = 0 # On initialise la somme des éléments de tab à 0.
for elt in tab: # On parcourt le tableau tab et on affecte à elt les éléments de tab.}
somme = somme + elt # On ajoute elt à la somme précédente.
moyenne = somme/len(tab) # On affecte Ă la variable moyenne le quotient de la variable somme et de la taille du tableau tab.
print(moyenne) # On affiche la moyenne.
On utilise ici le paradigme séquentiel car les instructions sont exécutées ligne par ligne.
En programmation procédurale, cela peut donner le code suivant :
Exemple de code en programmation procédurale
"""
Autre code permettant de calculer la moyenne du tableau tab = [1, 2, 3, 4, 5]
"""
tab = [1, 2, 3, 4, 5] # On définit le tableau.
def somme(tab): # On définit la fonction somme qui prend en paramÚtre tab un tableau de nombres et retourne la somme de ses éléments.
resultat = 0
for elt in tab:
resultat = resultat + elt
return resultat
def moyenne(tab): # On définit la fonction moyenne qui prend en paramÚtre tab un tableau de nombres et retourne la moyenne de ses éléments.
n = len(tab)
return somme(tab)/n
print(moyenne(tab)) # On affiche la moyenne.
Ce code peut paraßtre plus long que le précédent, mais les fonctions somme(tab)
et moyenne(tab)
seront directement réutilisables sans nécessité de les coder à nouveau car elle ont été définies.
3.3. Avantages et inconvĂ©nientsâïž
Lâavantage principal de la programmation impĂ©rative est que le code est trĂšs lisible, ce qui en facilite lâapprentissage.
Ce paradigme produit toutefois vite des programmes volumineux, les codes peuvent ainsi perdre en clarté. De plus, en cas de modification ou de mise à jour du code, la programmation impérative peut induire un bon nombre de bugs puisque il faut relire le code dans son entier et effectuer de nombreuses retouches.
IV. Le paradigme fonctionnelâïž
4.1. GĂ©nĂ©ralitĂ©sâïž
Le paradigme fonctionnel consiste à décomposer les programmes réalisés en un ensemble de fonctions.
En programmation fonctionnelle lâordre dâexĂ©cution du code nâa aucune importance.
La programmation fonctionnelle consiste à écrire le résultat que devra rendre la fonction selon les données fournies. Ce résultat est décrit par
une expression dépendant des paramÚtres de la fonction et est noté en Python aprÚs le mot-clé return
. Il nâest plus utile ici de dĂ©crire une suite dâinstructions, comme en programmation impĂ©rative. Seul le rĂ©sultat compte. Si lâĂ©criture de lâexpression rĂ©sultat est trop complexe, il est possible de dĂ©composer le problĂšme et de prĂ©senter lâĂ©criture du rĂ©sultat comme la composition de plusieurs fonctions intermĂ©diaires. Il est aussi possible de dĂ©composer par cas grĂące Ă lâexpression conditionnelle.
Fonctions pures et impures
Les fonctions doivent idĂ©alement produire des sorties qui ne dĂ©pendent strictement que de leurs arguments, sans que ces sorties ne dĂ©pendent de variables externes Ă la fonction elle-mĂȘme. On parle alors de « fonctions pures ».
A contrario, les fonctions qui ne respectent pas ce principe sont appelées des « fonctions impures ».
Exemple de fonction impure
Cette fonction est impure car n
est une variable externe Ă la fonction fonc1(a)
.
En testant fonc1(2)
deux fois de suite, on nâobtient dâailleurs pas le mĂȘme rĂ©sultat.
Exemple de fonction pure
Si on teste fonc2(2)
deux fois de suite, on obtiendra bien alors le mĂȘme rĂ©sultat.
4.2. Avec Pythonâïž
Le paradigme impĂ©ratif nâest pas supportĂ© par tous les langages de programmation.
Le langage Python offre un certain nombre dâoutils pour utiliser le paradigme fonctionnel.
-
Les lambda fonctions ou fonctions anonymes Elles permettent de définir des fonctions sans le mot-clé
def
et pour lesquelles le mot-cléreturn
est implicite. Ces fonctions utilisent le mot-clélambda
.Exemple de lambda fonction
Dans les deux cas, lâutilisation de la fonction est la mĂȘme. Par exemple,
carre(3)
retournera9
.Dans cet exemple, la lambda fonction est référencée par la variable
carre
.Il est possible de ne pas utiliser de variable qui référence une lambda fonction, notamment avec les fonctions
map
,filter
etreduce
. -
La fonction
map
La fonction
map
permet dâappliquer une fonction Ă tous les Ă©lĂ©ments dâun tableau.map(fonc, tab)
prend ainsi en paramĂštres une fonctionfonc
et un tableautab
(ou un objet itérable) ; cette fonction retourne un itérateur dont les éléments sont les images des éléments detab
par la fonctionfonc
.La fonction
list()
permet dâen obtenir une liste. -
La fonction
filter
La fonction
filter
permet de filtrer les Ă©lĂ©ments dâun tableau.filter(fonc, tab)
prend ainsi en paramĂštres une fonctionfonc
qui retourneTrue
ouFalse
et un tableautab
(ou un objet itérable) ; cette fonction retourne un itérateur dont les éléments detab
ontTrue
pour image par la fonctionfonc
. -
La fonction
reduce
La fonction
reduce
permet de calculer une valeur Ă partir dâune fonction et de tous les Ă©lĂ©ments dâun tableau.reduce(fonc, tab)
, du modulefunctools
, prend ainsi en paramĂštres une fonctionfonc
Ă deux paramĂštres et un tableautab
(ou un objet itérable) ; cette fonction retourne une valeur.Principe
Au premier appel, les deux premiers éléments de
tab
sont les arguments defonc
.Le résultat et le troisiÚme élément de
tab
sont ensuite les arguments defonc
, et ainsi de suite.Ainsi, aprÚs le parcours de tous les éléments de
tab
, la valeur finale est retournée.
4.3. Avantages et inconvĂ©nientsâïž
Lâavantage principal du paradigme fonctionnel est de produire des codes courts et faciles Ă dĂ©bugger. Il suffit de tester chacune de ses fonctions pour valider les codes.
La programmation fonctionnelle nâest toutefois pas facile Ă apprĂ©hender, elle demande une certaine expertise. Elle ne convient de plus pas Ă toutes les tĂąches.