Erreur Python : ZeroDivisionError
NSI Première
Définition
La `ZeroDivisionError` survient quand on divise par zéro, ce qui est mathématiquement impossible. Le message dépend de l'opérateur utilisé : `division by zero` pour la division `/`, `integer division or modulo by zero` pour la division entière `//`, `integer modulo by zero` pour le modulo `%`, et `float division by zero` avec des flottants. La cause la plus fréquente n'est pas un `0` écrit en clair, mais une variable qui vaut 0 au moment du calcul — par exemple la longueur d'une liste vide dans le calcul d'une moyenne.
Exemple corrigé
Énoncé
Voici un code qui déclenche cette erreur :
```python
def moyenne(notes):
return sum(notes) / len(notes)
notes_eleve = []
print(moyenne(notes_eleve))
```
À l'exécution, Python s'arrête et affiche :
```
ZeroDivisionError: division by zero
```
Solution
La cause : la liste `notes_eleve` est vide, donc `len(notes)` vaut `0`. Le calcul `sum(notes) / len(notes)` revient à diviser par zéro, ce que Python interdit.
Code corrigé :
```python
def moyenne(notes):
if len(notes) == 0:
return 0.0 # ou lever une exception, selon le besoin
return sum(notes) / len(notes)
notes_eleve = []
print(moyenne(notes_eleve))
```
On teste si la liste est vide avant de diviser.
Le bon réflexe : avant toute division, demande-toi si le dénominateur peut valoir 0 (liste vide, compteur jamais incrémenté…) et protège le calcul par un test.
Erreurs classiques
- Croire que `0 / 5` plante : c'est faux, `0 / 5` vaut `0.0`. Seule la division par zéro est interdite.
- Confondre avec une `TypeError` : `5 / "0"` ne donne pas une `ZeroDivisionError` mais une `TypeError` (on ne divise pas un nombre par du texte).
- Oublier que le message change selon l'opérateur : `5 // 0` affiche `integer division or modulo by zero`, tandis que `5 % 0` affiche `integer modulo by zero`.