Lingua-e
← Errores
Python

Qué significa StopIteration y cómo solucionarlo

Referencia del error

StopIteration

Lenguaje

Python

Severidad

Baja

Cuándo ocurre

StopIteration es lanzado por el método __next__() de un iterador para indicar que no hay más elementos que producir.

Posibles soluciones

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).

Errores relacionados

Más detalles

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).

Posibles soluciones

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).

Ejemplos

Python

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 exhausted

Error en la terminal

1
2
3
Traceback (most recent call last):
  File "app.py", line 6, in <module>
    print(next(numbers))
StopIteration

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)

Practica en inglés

¿Cómo le explicarías un StopIteration a un compañero dev? Elige la frase correcta:

"I hit an error...

¿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