Aller au contenu

Partie 4 : Erreurs et bonnes pratiques


Apprendre à lire et comprendre les messages d'erreur est une compétence essentielle. Python affiche toujours un message qui indique :

  1. Où l'erreur s'est produite (numéro de ligne)
  2. Quel type d'erreur c'est
  3. Un message explicatif
Traceback (most recent call last):
File "mon_programme.py", line 3, in <module>
print(age + " ans")
~~~~^~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • Ligne 1 : début du traceback (remontée de l'erreur)
  • Ligne 2 : fichier et numéro de ligne concernés
  • Ligne 3 : la ligne de code fautive
  • Ligne 4 : une flèche pointant vers l'endroit exact de l'erreur
  • Ligne 5 : le type d'erreur et son explication

Python ne peut même pas démarrer l'exécution du programme car le code est mal écrit :

# ❌ Oubli du deux-points
if age >= 18
print("Majeur")
# SyntaxError: expected ':'
# ❌ Oubli d'une parenthèse fermante
print("Bonjour"
# SyntaxError: '(' was never closed
# ❌ Oubli d'un guillemet fermant
nom = "Alice
# SyntaxError: unterminated string literal
# ❌ Utilisation d'un mot réservé comme variable
class = "2nde B"
# SyntaxError: invalid syntax
# ❌ Oubli du = dans une affectation
if age = 18:
# SyntaxError: invalid syntax. Maybe you meant '==' or ':='?
# ❌ Bloc non indenté
if True:
print("Bonjour")
# IndentationError: expected an indented block after 'if' statement
# ❌ Indentation inattendue
x = 5
y = 10
# IndentationError: unexpected indent
# ❌ Mélange tabulations et espaces (très sournois !)
if True:
print("tab") # tabulé
print("espaces") # 4 espaces
# IndentationError: unindent does not match any outer indentation level

La variable ou la fonction n'existe pas dans le contexte actuel :

# ❌ Variable pas encore définie
print(resultat)
# NameError: name 'resultat' is not defined
# ❌ Faute de frappe
age_eleve = 16
print(age_elve) # 'elve' au lieu de 'eleve'
# NameError: name 'age_elve' is not defined
# ❌ Oubli des guillemets autour d'un texte
print(Bonjour)
# NameError: name 'Bonjour' is not defined
# ❌ Variable locale utilisée hors de la fonction
def ma_fonction():
resultat = 42
ma_fonction()
print(resultat)
# NameError: name 'resultat' is not defined

On essaie de faire une opération incompatible avec le type des données :

# ❌ Additionner un nombre et une chaîne
print(5 + "3")
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
# ❌ Concaténer un nombre à une chaîne
print("J'ai " + 16 + " ans")
# TypeError: can only concatenate str (not "int") to str
# ❌ Multiplier deux chaînes
print("abc" * "def")
# TypeError: can't multiply sequence by non-int of type 'str'
# ❌ Appeler quelque chose qui n'est pas une fonction
x = 5
x()
# TypeError: 'int' object is not callable
# ❌ Utiliser len() sur un nombre
len(42)
# TypeError: object of type 'int' has no len()

La valeur n'est pas adaptée, même si le type est correct :

# ❌ Convertir un texte en nombre
int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'
# ❌ Convertir un décimal en int directement
int("3.14")
# ValueError: invalid literal for int() with base 10: '3.14'
# ❌ Chercher un élément absent d'une liste
[1, 2, 3].index(5)
# ValueError: 5 is not in list

On accède à un indice qui n'existe pas :

notes = [15, 12, 18]
notes[3]
# IndexError: list index out of range
# Les indices valides sont 0, 1, 2 (ou -1, -2, -3)
notes[10]
# IndexError: list index out of range
# ❌ Erreur classique avec range
for i in range(len(notes) + 1): # range va jusqu'à 3, mais l'indice 3 n'existe pas
print(notes[i])
# IndexError: list index out of range
print(10 / 0)
# ZeroDivisionError: division by zero
print(10 // 0)
# ZeroDivisionError: integer division or modulo by zero
print(10 % 0)
# ZeroDivisionError: integer division or modulo by zero
ErreurCause couranteComment corriger
SyntaxErrorOubli de :, parenthèse, guillemetRelire la ligne indiquée, vérifier la ponctuation
IndentationErrorMauvaise indentation ou mélange tab/espacesAligner les blocs à 4 espaces
NameErrorVariable inexistante, faute de frappe, oubli de ""Vérifier le nom, l'ordre des instructions
TypeErrorOpération entre types incompatiblesConvertir avec int(), float(), str()
ValueErrorConversion impossible (int("abc"))Vérifier la valeur avant de convertir
IndexErrorIndice hors limites d'une listeVérifier len() et les bornes de range()
ZeroDivisionErrorDivision par zéroTester if diviseur != 0 avant de diviser

En programmation, il existe souvent plusieurs approches pour résoudre un même problème. Voici les plus courantes.

nom = "Alice"
age = 16
# Méthode 1 : concaténation avec +
message = "Je m'appelle " + nom + " et j'ai " + str(age) + " ans."
# Méthode 2 : virgules dans print()
print("Je m'appelle", nom, "et j'ai", age, "ans.")
# Méthode 3 : f-string (recommandée ✅)
message = f"Je m'appelle {nom} et j'ai {age} ans."
# Méthode 4 : .format()
message = "Je m'appelle {} et j'ai {} ans.".format(nom, age)

10.2. Tester si un élément est dans une collection

Section intitulée « 10.2. Tester si un élément est dans une collection »
voyelles = "aeiouy"
lettre = "e"
# Méthode 1 : avec in (recommandée ✅)
if lettre in voyelles:
print("C'est une voyelle")
# Méthode 2 : avec une boucle
est_voyelle = False
for v in voyelles:
if lettre == v:
est_voyelle = True
if est_voyelle:
print("C'est une voyelle")
# Méthode 3 : avec or (fastidieux mais explicite)
if lettre == "a" or lettre == "e" or lettre == "i":
print("C'est une voyelle")
nombres = [3, 7, 2, 9, 4]
# Méthode 1 : boucle for avec accumulateur
total = 0
for n in nombres:
total += n
# Méthode 2 : fonction intégrée sum() (recommandée ✅)
total = sum(nombres)
# Méthode 3 : boucle while
total = 0
i = 0
while i < len(nombres):
total += nombres[i]
i += 1
# Méthode 1 : boucle for avec append
carres = []
for i in range(1, 6):
carres.append(i ** 2)
# [1, 4, 9, 16, 25]
# Méthode 2 : compréhension de liste (plus avancé, très « pythonique »)
carres = [i ** 2 for i in range(1, 6)]
# [1, 4, 9, 16, 25]
# Méthode 3 : avec list() et range()
nombres = list(range(1, 11))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a, b = 10, 20
# Méthode 1 : variable temporaire (classique, universelle)
temp = a
a = b
b = temp
# Méthode 2 : affectation multiple Python (recommandée ✅)
a, b = b, a
# Méthode 3 : arithmétique (sans variable supplémentaire, pour les curieux)
a = a + b # a = 30
b = a - b # b = 10
a = a - b # a = 20
# Méthode 1 : saisie + boucle while
note = float(input("Note (0-20) : "))
while not (0 <= note <= 20):
note = float(input("Invalide. Note (0-20) : "))
# Méthode 2 : while True + break
while True:
note = float(input("Note (0-20) : "))
if 0 <= note <= 20:
break
print("Invalide, recommencez.")
# Méthode 3 : avec une fonction
def saisir_note():
while True:
note = float(input("Note (0-20) : "))
if 0 <= note <= 20:
return note
print("Invalide, recommencez.")
note = saisir_note()


NotionSyntaxeCe qu'il faut retenir
Variablex = 42Espace mémoire nommé qui stocke une valeur
Affectationx = valeurLe = stocke la valeur de droite dans la variable
Affectation augmentéex += 3Raccourci pour x = x + 3
Typesint, float, str, boolEntier, décimal, texte, booléen
Conversionint(), float(), str()Change le type d'une valeur
Séquence-Les instructions s'exécutent de haut en bas
if / elif / elseif cond:Exécute un bloc selon qu'une condition est vraie ou fausse
Comparaison==, !=, <, >, <=, >=Renvoie True ou False
Logiqueand, or, notCombine des conditions
forfor i in range(n):Boucle bornée, nombre de répétitions connu
whilewhile cond:Boucle non bornée, répète tant que la condition est vraie
breakbreakSort immédiatement de la boucle
continuecontinuePasse directement au tour suivant
Fonctiondef nom(params):Bloc de code réutilisable
returnreturn valeurRenvoie un résultat depuis une fonction
Liste[1, 2, 3]Collection ordonnée et modifiable de valeurs
input()input("message")Lit une saisie (renvoie toujours un str)
print()print(valeurs)Affiche des valeurs à l'écran
f-stringf"texte {var}"Insère des variables dans du texte