Exercice : 401 : Python - Calculs - Tests
Objectifs
Concepts clés abordés
Variables en Python : affectation, typage dynamique, manipulations (float, string, int).
Input et affichage : utilisation de
print()pour afficher des résultats, formattage avecstr()ou f-strings (plus moderne).Calculs simples : opérations arithmétiques de base.
Contrôles conditionnels :
if,else,elifpour gérer différentes situations.Vérification de la validité des données (valeurs attendues).
Utilisation de l'indentation pour délimiter les blocs.
Gestion d’erreurs et exceptions :
Structure
try-exceptpour traiter les erreurs d'exécution.Différenciation des types d’erreurs (
TypeError,ZeroDivisionError).Validation préventive des données avec
if.
Test de cohérence des données : vérifier si les valeurs entrées sont dans un intervalle attendu.
Commentaires dans le code : utiliser
#et'''pour commenter/desactiver du code, ou documenter.Documentation et bonnes pratiques : structuration claire, gestion des erreurs, validation des données.
Conditions de validation : exemple avec la fiabilité R(t) et le TRG (taux de défaillance).
Pré-requis
Disposer d'un environnement de développement en python : cf la procédure N ° T-0037 : PythonAnywhere
Affecter une variable
Afficher une variable : print()
Convertir une variable de type float en string : str ()
Votre dossier de travail pour stocker vos fichiers est app/fiab/
Question
N0, Nt et Rt sont les noms de variable à utiliser :
Affecter N0 à 1000
Affecter Nt à 490
Calculer Rt
Afficher Rt
Afficher le texte suivant : La fiabilité est de {Rt} % (voir ci-contre)

Solution
py_cor :
# code 401-1 : Calcul de fiabilité observée R(t)# R(t) = N(t) / N(0)# Initialisation des donnéesN0 = 1000 # Nombre initial de composants
Nt = 490 # Nombre de composants fonctionnels à l'instant t
# Calcul de la fiabilitéRt = Nt / N0
print(Rt)
# Affichage formaté avec f-string (Python 3.6+)mess = f"La fiabilité est de {Rt*100:.2f} %"
print(mess)
# Note : .2f limite l'affichage à 2 décimalesFaire des tests (if else elif)
Tester la validité des données en ajoutant l'affichage d'une variable err si le trg n'est pas compris entre 0 et 1
tu = 103
to = 100
trg = tu/to
# on met la variable err à VRAI (true) si le trg n'est pas compris entre 0 et 1err = not ((trg>=0) and (trg<=1))
print (err)
Faire des tests en modifiant les valeurs de tu et to pour vérifier que l'on affiche true ou false si il y a une incohérence
Avec un test sur la variable err, on affiche un message adapté à l'utilisateur. Il faut donc ajouter le code ci-dessous
if err :
print (f"❌ Erreur avec tu = {tu} hrs et to = {to} hrs")
else :print (f"✓ Le TRG est de {trg*100:.2f} % avec tu = {tu} hrs et to = {to} hrs")
NOTER l'importance du symbole : qui marque le début des blocs if et else
NOTER que chaque bloc est indenté avec la touche TAB pour que l'instruction à exécuter fasse bien partie du bloc.
Ci-contre, en cliquant sur les flèches des lignes 5 et 7, vous pouvez d'ailleurs replier les blocs pour être conscient du rôle joué par l'indentation.
« En C/C++, on utilise les accolades {} pour marquer les débuts/fins de bloc ainsi que le ; pour marquer la fin d'une instruction »
« Python n'oblige pas déclarer les variables en préalable à une affectation »

Question
Vous pouvez continuer à travailler avec le même fichier .py en mettant le code que vous ne souhaitez plus exécuter avec des tripe cotes (''') en début et fin du code concerné
# est utilisé pour commenté une ligne (il peut donc être utilisé pour empêcher l'exécution d'un print par exemple)
Appliquez la méthode à votre calcul de la fiabilité en y ajoutant le fait que la valeur N0 ne peut pas être égale à 0 puisque la division par 0 donnerait une erreur.
Pour être sûr que votre code fonctionne bien, vous devrez tester les 3 cas possibles avec Nt = 490, puis N0 = 0 puis N0 = -2
Vous testerez N0 = "toto". Que se passe t-il ? comment tester ce cas ?
Solution
# code 401-2 : Calcul de fiabilité avec validation des donnéesN0 = 1000 # Nombre initial de composants
Nt = -2 # Valeur de test (invalide)
# Validation 1 : N0 doit être strictement positif (CORRECTION: tester N0, pas Nt)err1 = (N0 <= 0)
if err1:
mess = f"❌ Erreur : N0 ({N0}) doit être strictement positif"
else: # Calcul de la fiabilitéRt = Nt / N0
# Validation 2 : R(t) doit être dans [0, 1]err2 = Rt < 0 or Rt > 1
if err2:
mess = f"❌ Erreur : La fiabilité ({Rt:.3f}) doit être comprise entre 0 et 1"
mess += f"\n Vérifiez vos valeurs : N0={N0}, Nt={Nt}"
else:mess = f"✓ La fiabilité est de {Rt*100:.2f} %"
print(mess)
Gérer les exceptions
Dans l'exercice précédent, le programme est interrompu avec un message d'erreur.
Jusque là, nous avions testé des incohérences (TRG ou R(t) non compris entre 0 et 1) ou anticipé sur le risque d'une erreur (division par 0)
Avec python, il est possible d'essayer si une instruction peut s'exécuter et mettre en place des traitements adaptés selon différents cas :
pas d'erreur
présence d'une erreur
tu = 95
to = "toto"
try:to = tu/to
print("Ok pas d'erreur")
except :print("Impossible de faire le calcul de tu/to")
Tester ce code avec to = 100, to = 90, to = 0, to = "toto"
On peut faire mieux en récupérant la nature de l'erreur
tu = 95
to = 100
trg = 0.99 # Pour initialiser le trg calculé plus loin en float.
try:trg = tu/to
print("Ok pas d'erreur")
except TypeError:
print("Merci d'utiliser des chiffres")
except ZeroDivisionError:
print("Merci de ne pas utiliser le 0")
Tester ce code avec to = 100, to = 90, to = 0, to = "toto"
Vous remarquerez que l'incohérence des données (cas trg non compris entre 0 et 1) n'est pas évalué ici, car cela ne déclenche pas une erreur d'exécution, il fut donc faire un test traditionnel avec if comme nous l'avons vu précédemment.
Question
Mettre en oeuvre les exceptions et les tests pour afficher les erreurs et incohérences lors du calcul de R(t)
Solution
# code 401-3 : Calcul de fiabilité avec gestion d'exceptionsN0 = 1000 # Testez avec : 1000, 0, "toto"
Nt = 490 # Testez avec : 490, 1200, "abc"
try: # Tentative de calculRt = Nt / N0
# Validation de cohérence (ne déclenche pas d'exception)err = Rt < 0 or Rt > 1
if err:
mess = f"⚠️ Incohérence : La fiabilité ({Rt:.3f}) doit être comprise entre 0 et 1"
mess += f"\n Valeurs utilisées : N0={N0}, Nt={Nt}"
else:mess = f"✓ La fiabilité est de {Rt*100:.2f} %"
except TypeError as e:
# Erreur de type (ex: "toto" / 100)mess = f"❌ Erreur de type : Utilisez des nombres, pas du texte"
mess += f"\n Détail technique : {e}"
except ZeroDivisionError:
# Division par zéromess = f"❌ Erreur mathématique : N0 ne peut pas être égal à 0"
mess += f"\n Division par zéro impossible"
except Exception as e:
# Autres erreurs imprévuesmess = f"❌ Erreur inattendue : {type(e).__name__}: {e}"
print(mess)
