Conditions sur les paramètres☘
Précondition☘
Une précondition est une condition à respecter par les paramètres pour que le calcul effectué par la fonction ait un sens.
Par exemple, pour une fonction racine carrée racineCarree(x)
,
le paramètre x est un flottant et l'on imposera la précondition
x \geqslant 0.
def racineCarree(x):
"""
x -- flottant
précondition: x >= 0
renvoie le flottant racine carrée de x
"""
Précondition dans le code☘
On peut également renforcer une précondition dans le code à l'aide d'un assert
.
La syntaxe:
assert condition à respecter, "Message d'alerte à l'utilisateur en cas de non respect de la précondition"
Exemple:
def racineCarree(x):
"""
x -- flottant
précondition: x >= 0
renvoie le flottant racine carrée de x
"""
assert x >= 0, "Le paramètre x doit être positif ou nul."
return x**0.5
A vous☘
Tester la fonction racineCarree proposée avec une valeur de x négative. Puis tester avec des valeurs positives.
Exercice☘
Écrire une fonction prenant en paramètres quatre entiers a, b, c, d et renvoyant en sortie True si la fraction \frac{a}{b} est égale à la fraction \frac{c}{d} et renvoie False sinon.
Quelle précondition semble-t-il raisonnable d'imposer? Utiliser un assert pour le traduire dans le code.
Attention
Le code if a/b == c/d
serait une bien mauvaise idée.
Rappelez vous: on ne peut pas comparer des flottants!
Pour bien se convaincre que cela engendrera des erreurs, un exemple:
>>> a = 10**20+1
>>> b = 10**20
>>> c = 10**20
>>> d = 10**20
Avec ces nombres, il est clair que l'on a \frac{c}{d} = 1 puisque c et d sont égaux mais que \frac{a}{b} \neq 1 puisque a et b ne sont pas égaux.
Pourtant:
>>> a/b == c/d
True
a/b == c/d
ne donnera pas une conclusion correcte.
Un code
def fractionsEgales(a, b, c, d):
"""
a -- entier naturel
b -- entier naturel
précondtion: b non nul
c -- entier naturel
d -- entier naturel
précondition: d non nul
"""
assert b != 0, "Attention, le dénominateur b ne peut être nul."
assert d != 0, "Attention, le dénominateur d ne peut être nul."
return a*d == b*c