StopIteration es lanzado por el método __next__() de un iterador para indicar que no hay más elementos que producir. Es la señal de terminación normal para los iteradores y es capturada automáticamente por los bucles for, pero se propagará como error si llamas a next() manualmente sin un valor por defecto.
Por qué ocurre
- •Llamar a next() sobre un iterador que ya fue completamente consumido.
- •Usar next() dentro de una función generadora, lo que hace que el propio generador se detenga.
- •Iterar manualmente con next() en lugar de usar un bucle for, sin proporcionar un valor por defecto.
- •Consumir un generador o iterador en un lugar e intentar iterarlo de nuevo (los iteradores no se pueden rebobinar).
Ejemplos
Código que causa el error
numbers = iter([1, 2, 3])
print(next(numbers)) # 1
print(next(numbers)) # 2
print(next(numbers)) # 3
print(next(numbers)) # iterator is exhaustedError en la terminal
1
2
3
Traceback (most recent call last):
File "app.py", line 6, in <module>
print(next(numbers))
StopIterationCómo solucionarlo
Pasa un valor por defecto como segundo argumento a next(): next(it, None). Usa bucles for en lugar de llamadas manuales a next() para iteraciones simples. Si necesitas iterar un iterador varias veces, conviértelo primero a lista con list(iterador).
Código corregido
numbers = iter([1, 2, 3])
# Use a default value to avoid the exception
value = next(numbers, None)
while value is not None:
print(value)
value = next(numbers, None)
# Or simply iterate with a for loop:
for n in [1, 2, 3]:
print(n)Errores relacionados
¿Listo para practicar tu inglés en el trabajo?
Lingua-e tiene ejercicios interactivos basados en conversaciones reales de developers: standups, code reviews, retrospectivas y más. Practica hasta que salga solo.
Prueba Lingua-e gratis