Livre_silo 30 août 2013 16:32 Page 126
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
126
Informatique pour tous
5.2.3 Fonctions partielles
Les fonctions considérées jusqu’à présent sont des fonctions totales, c’est-à-dire qu’elles renvoient toujours un résultat, quelle que soit la valeur de leurs arguments. Il existe aussi des
fonctions dites partielles parce qu’ elles ne renvoient pas un résultat pour toutes les valeurs
possibles des arguments. Par exemple, la fonction divise ci-après est partielle :
def divise(x, y):
return x // y
En effet, tout appel à divise avec un deuxième argument égal à 0 va interrompre l’exécution
de la fonction et provoquer l’affichage du message d’erreur suivant :
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in divise
ZeroDivisionError: integer division or modulo by zero
Pour définir plus proprement une fonction partielle, il est préférable de vérifier que les
valeurs passées en argument sont bien dans son domaine d’utilisation. On peut pour cela
vérifier une précondition à l’aide d’une instruction assert e. Cette instruction évalue l’expression booléenne e et provoque une erreur AssertionError si e est fausse. Ainsi, on peut
ajouter une instruction assert y != 0 à la fonction divise pour interrompre son exécution
si y est égal à 0 :
def divise(x, y):
assert y != 0
return x // y
Le message d’erreur suivant est alors affiché dès que l’expression y != 0 est évaluée à False :
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in divise
AssertionError
Afin d’afficher un message d’erreur plus informatif que AssertionError, on peut associer
une deuxième expression à assert. Cette seconde expression sera évaluée uniquement si la
première est fausse et sa valeur sera affichée pour compléter le message d’erreur. Ainsi, on
peut écrire :
def divise(x, y):
assert y != 0, 'division par 0 impossible'
return x // y
Le message suivant sera affiché chaque fois que l’expression y != 0 sera fausse :
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in divise
AssertionError: division par 0 impossible
Il est préférable de placer ces préconditions au début du corps de la fonction, afin de s’assurer qu’aucune instruction n’est exécutée si les arguments ne sont pas dans le domaine de
Précédent

- 139/402

Suivant