StopIteration
Python
Erreur courante
Explication
`StopIteration` est l'exception levée par `next()` quand un **itérateur est épuisé** (plus aucun élément). À l'intérieur d'une boucle `for`, Python la gère automatiquement ; elle ne « fuit » que lorsque vous appelez `next()` manuellement sans valeur par défaut.
```python
it = iter([1, 2])
next(it) # 1
next(it) # 2
next(it) # plus d'éléments
# StopIteration
```
Causes courantes
- **Appel à `next()`** au-delà du dernier élément, sans valeur par défaut. - **Itération manuelle** mal bornée. - **`raise StopIteration` dans un générateur** : depuis Python 3.7, cela devient une `RuntimeError` (PEP 479).
1. Donnez une valeur par défaut à next()
it = iter([1, 2])
valeur = next(it, None) # None quand l'itérateur est épuisé, pas d'erreur
2. Préférez une boucle for (qui gère l'arrêt)
for valeur in [1, 2]:
print(valeur) # StopIteration interceptée automatiquement
3. Dans un générateur, utilisez return, pas raise
def jusqua(n):
i = 0
while i < n:
yield i
i += 1
return # ✅ termine le générateur (ne pas faire raise StopIteration)
Comment prevenir cette erreur
- **Utilisez `next(it, defaut)`** quand vous itérez manuellement.
- **Bouclez avec `for`** dès que possible.
- Dans les générateurs, terminez par `return` (jamais `raise StopIteration`).
- Référence : [docs.python.org — StopIteration](https://docs.python.org/fr/3/library/exceptions.html#StopIteration).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Pourquoi `for` ne déclenche-t-il jamais cette erreur ?
Parce que la boucle `for` intercepte `StopIteration` pour savoir quand s'arrêter : c'est son fonctionnement normal. L'erreur n'apparaît que si vous appelez `next()` vous-même sans valeur de repli.
Pourquoi `raise StopIteration` dans mon générateur provoque une `RuntimeError` ?
À cause de la PEP 479 (Python 3.7+) : lever explicitement `StopIteration` dans un générateur est interdit pour éviter des bugs silencieux. Utilisez `return` pour terminer le générateur.