def divise(a, b):
"""Renvoie la division de a par b ou une erreur."""
if b == 0:
return "Erreur : division par 0"
return a / b
Pourquoi est-ce une mauvaise idée ?
def divise(a, b):
"""Renvoie la division de a par b."""
if b == 0:
return float("inf")
return a / b
Pourquoi est-ce une mauvaise idée ?
def niveau_gris(rouge, vert, bleu):
"""Renvoie un niveau de gris à partir d'une couleur RVB.
rouge, vert et bleu sont des entiers dans [0 ; 255].
"""
if rouge < 0 or rouge > 255:
return None
if vert < 0 or vert > 255:
return None
if bleu < 0 or bleu > 255:
return None
return (rouge + vert + bleu) // 3
Pourquoi est-ce une mauvaise idée ?
def divise(a, b):
"""Renvoie la division de a par b et un statut."""
if b == 0:
return 0, False
return a / b, True
resultat, succes = divise(15, 0)
if succes:
print(resultat)
def niveau_gris(rouge, vert, bleu):
"""Renvoie un niveau de gris à partir d'une couleur RVB.
rouge, vert et bleu sont des entiers dans [0 ; 255].
"""
if rouge < 0 or rouge > 255:
return 0, 1
if vert < 0 or vert > 255:
return 0, 2
if bleu < 0 or bleu > 255:
return 0, 3
return (rouge + vert + bleu) // 3, 0
gris, statut = niveau_gris(255, 0, 0)
if statut == 0:
print(f"ok : {gris}")
else:
print(f"Erreur : l'argument n°{statut} n'est pas dans [0 ; 255]")
SUCCES = 0
ERREUR_ROUGE = 1
ERREUR_VERT = 2
ERREUR_BLEU = 3
def niveau_gris(rouge, vert, bleu):
"""Renvoie un niveau de gris à partir d'une couleur RVB.
rouge, vert et bleu sont des entiers dans [0 ; 255].
"""
if rouge < 0 or rouge > 255:
return 0, ERREUR_ROUGE
if vert < 0 or vert > 255:
return 0, ERREUR_VERT
if bleu < 0 or bleu > 255:
return 0, ERREUR_BLEU
return (rouge + vert + bleu) // 3, SUCCES
SUCCES = 0
ERREUR_ROUGE = 1
ERREUR_VERT = 2
ERREUR_BLEU = 3
MESSAGES = {
SUCCES : "OK",
ERREUR_ROUGE : "Rouge à l'extérieur de l'intervalle [0 ; 255]",
ERREUR_VERT : "Vert à l'extérieur de l'intervalle [0 ; 255]",
ERREUR_BLEU : "Bleu à l'extérieur de l'intervalle [0 ; 255]"
}
def niveau_gris(rouge, vert, bleu):
# [...]
gris, statut = niveau_gris(255, 0, 0)
if statut == 0:
print(f"ok : {gris}")
else:
print(f"Erreur : {MESSAGES[statut]}")
liste = [0, 1, 2]
liste[3]
IndexError: list index out of range
resultat = 1 / 0
ZeroDivisionError: division by zero
IndexError
NameError
TypeError
ValueError
ZeroDivisionError
try:
# Bloc1 (bloc de code n°1)
except Erreur:
# Bloc2
except (AutreErreur, PasDeBol):
# Bloc3
except:
# Bloc4
else:
# Bloc5
finally:
# Bloc6
def divise(a, b):
return a / b
try:
resultat = divise(15, 0)
except ZeroDivisionError:
print("Error: division par zéro")
else:
print(f"Le résultat est {resultat}")
def divise(a, b):
return a / b
try:
resultat = divise(15, 0)
print(f"Le résultat est {resultat}")
except ZeroDivisionError:
print("Error: division par zéro")
def divise(a, b):
return a / b
try:
resultat = divise(15, 0)
print(f"Le résultat est {resultat}")
except:
print("Error: division par zéro")
def divise(a, b):
return a / b
try:
resultat = divise(15, 0)
except ZeroDivisionError:
print("Error: division par zéro")
else:
print(f"Le résultat est {resultat}")
finally:
print("On passe ici")
Error: division par zéro
On passe ici
def divise(a, b):
return a / b
try:
resultat = divise(15, 1)
except ZeroDivisionError:
print("Error: division par zéro")
else:
print(f"Le résultat est {resultat}")
finally:
print("On passe ici")
Le résultat est 15
On passe ici
except
adapté.def niveau_gris(rouge, vert, bleu):
"""Renvoie un niveau de gris à partir d'une couleur RVB.
rouge, vert et bleu sont des entiers dans [0 ; 255].
"""
if rouge < 0 or rouge > 255:
raise ValueError("Rouge en dehors de [0 ; 255]")
if vert < 0 or vert > 255:
raise ValueError("Vert en dehors de [0 ; 255]")
if bleu < 0 or bleu > 255:
raise ValueError("Bleu en dehors de [0 ; 255]")
return (rouge + vert + bleu) // 3
try:
gris = niveau_gris(255, -1, 0)
print(gris)
except ValueError as erreur:
print(erreur)
def f():
print("Entrée dans f")
raise ValueError("peu importe...")
print("Sortie de f")
def g():
print("Entrée dans g")
f()
print("Sortie de g")
def h():
print("Entrée dans h")
g()
print("Sortie de h")
try:
h()
except ValueError:
print("Fin")
Entrée dans h
Entrée dans g
Entrée dans f
Fin
try
def lire_valeur(cast, message, erreur):
valeur = input(f"{message} : ")
try:
return cast(valeur)
except ValueError:
print(f"{valeur} : {erreur}")
valeur = lire_valeur(int, "Entrer un entier", "n'est pas un entier")
print(valeur)
si on entre "chocolat"
chocolat : n'est pas un entier
None
def divise(a, b):
try:
return a / b
except ZeroDivisionError as erreur:
raise ValueError("Dénominateur nul") from erreur
divise(15, 0)
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
ValueError: Dénominateur nul
class RougeErreur(Exception):
pass
class VertErreur(Exception):
pass
class BleuErreur(Exception):
pass
def niveau_gris(rouge, vert, bleu):
"""Renvoie un niveau de gris à partir d'une couleur RVB.
rouge, vert et bleu sont des entiers dans [0 ; 255].
"""
if rouge < 0 or rouge > 255:
raise RougeErreur("Rouge en dehors de [0 ; 255]")
if vert < 0 or vert > 255:
raise VertErreur("Vert en dehors de [0 ; 255]")
if bleu < 0 or bleu > 255:
raise BleuErreur("Bleu en dehors de [0 ; 255]")
return (rouge + vert + bleu) // 3
try:
gris = niveau_gris(255, -1, 0)
except RougeErreur as e:
print(f"Ecarlate : {e}")
except VertErreur as e:
print(f"Trop vert : {e}")
except BleuErreur as e:
print(f"Schtroumpf : {e}")
Trop vert : Vert en dehors de [0 ; 255]
racine_carree
x
est un nombre flottant positif ou nul.epsilon
est un nombre flottant strictement positif.x
et epsilon
sont inchangés.x
, à plus ou moins epsilon
.x
et epsilon
doivent être différents de NAN (Not A Number) et de l'infinie.x
et epsilon
peuvent également être des entiers.def divise(a, b):
"""Divise a par b.
a - nombre flottant.
b - nombre flottant non nul.
Retourne la division a / b.
"""
return a / b
def divise(a, b, epsilon=0.000001):
"""Divise a par b.
a - nombre flottant.
b - nombre flottant non nul.
epsilon - valeur autour de laquelle b est considérée nulle.
Retourne la division a / b.
"""
if abs(b) < epsilon:
raise ValueError("b est trop proche de 0")
return a / b
def divise(a, b, epsilon=0.000001):
"""Divise a par b.
a - nombre flottant.
b - nombre flottant non nul.
epsilon - valeur autour de laquelle b est considérée nulle.
Retourne la division a / b si a et b sont corrects.
"""
if type(a) != float and type(a) != int:
raise TypeError("a n'est ni int, ni float")
if type(b) != float and type(b) != int:
raise TypeError("b n'est ni int, ni float")
if abs(b) < epsilon:
raise ValueError("b est trop proche de 0")
return a / b
assert
.True
, le programme continue son exécution.AssertionError
est levée.assert 3 % 2 == 0
print("3 est divisible par 2")
AssertionError
assert 3 % 2 == 0, "Si 3 était divisible par 2, on le saurait"
print("3 est divisible par 2")
AssertionError: Si 3 était divisible par 2, on le saurait
assert 3 % 2 == 1
print("Le reste de la division de 3 par 2 est 1")
Le reste de la division de 3 par 2 est 1
min
, on a 2 entiers en entrée.a < 0 | a == 0 | a > 0 | |
---|---|---|---|
b < 0 | 3 tests (a < b, a == b, a > b) | Test 6 | Test 9 |
b == 0 | Test 4 | Test 7 | Test 10 |
b > 0 | Test 5 | Test 8 | 3 tests |
def min(a, b):
"""Renvoie le minimum entre a et b.
a - entier.
b - entier.
Renvoie a s'il est plus petit que b et b sinon.
"""
if b == 424242: # bug ou backdoor
return a
return a if a < b else b
def min(a, b):
if b == 424242:
return a
return a if a < b else b
for
break
, continue
, return
, yield
, etc.while
for
.while len(L) > 0 and (L[i] == "ok" or est_vrai):
# [...]
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
if x < 0:
raise ValueError("x est négatif")
s = x / 2
while abs(s ** 2 - x) >= epsilon:
P = s ** 2 - x
P_prime = 2 * s
s = s - P / P_prime
return s
def test_racine_carree_25():
# Arrange
x = 25
epsilon = 0.00001
attendu = 5
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def test_racine_carree_25_grand_epsilon():
# Arrange
x = 25
epsilon = 0.1
attendu = 5
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def test_racine_carree_0():
# Arrange
x = 0
epsilon = 0.00001
attendu = 0
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def test_racine_carree_1():
# Arrange
x = 1
epsilon = 0.00001
attendu = 1
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def test_racine_carree_negatif():
# Arrange
x = -1
exception_attrappee = False
# Agit
try:
racine_carree(x)
except:
exception_attrappee = True
# Affirme
assert exception_attrappee
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
pass
def test_racine_carree_25():
# Arrange
x = 25
epsilon = 0.00001
attendu = 5
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
return 5
def test_racine_carree_25_grand_epsilon():
# Arrange
x = 25
epsilon = 0.1
attendu = 5
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def test_racine_carree_0():
# Arrange
x = 0
epsilon = 0.00001
attendu = 0
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
return 5 if x == 25 else 0
def test_racine_carree_1():
# Arrange
x = 1
epsilon = 0.00001
attendu = 1
# Agit
resultat = racine_carree(x, epsilon)
# Affirme
assert abs(resultat - attendu) <= epsilon
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
if x == 25:
return 5
elif x == 0:
return 0
elif x == 1:
return 1
def test_racine_carree_negatif():
# Arrange
x = -1
exception_attrappee = False
# Agit
try:
racine_carree(x)
except:
exception_attrappee = True
# Affirme
assert exception_attrappee
def racine_carree(x, epsilon=0.000001):
"""Renvoie la racine carrée de x à epsilon près."""
if x < 0:
raise ValueError("x est négatif")
elif x == 25:
return 5
elif x == 0:
return 0
elif x == 1:
return 1