Une fonction sans effet de bord
Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 5 — Les fonctions · Définir et appeler une fonction
Énoncé
Expliquer la différence de comportement des deux fonctions ci-dessous, sachant que compteur est défini à l'extérieur. Laquelle est préférable, et pourquoi ?
compteur = 0
def incremente_A():
global compteur
compteur = compteur + 1
return compteur
def incremente_B(c):
return c + 1Corrigé
incremente_A modifie une variable extérieure : deux appels successifs renvoient puis . Le mot-clef global autorise cette écriture, sans laquelle Python créerait une variable locale.
incremente_B ne modifie rien : appelée deux fois avec le même argument, elle renvoie deux fois la même chose.
La seconde est très préférable, pour des raisons qui se vérifient toutes en pratique :
- elle est testable : son résultat ne dépend que de ses arguments, on peut la vérifier isolément ;
- elle est relisible : sa signature dit tout ce qu'elle fait, alors que
incremente_A()ne montre aucune de ses dépendances ; - elle est réutilisable ailleurs, sans traîner la variable globale avec elle.
On appelle effet de bord toute modification de l'état extérieur. On ne les proscrit pas — un print en est un — mais on les cantonne, et l'on évite qu'une fonction de calcul en ait.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.