Aquí está la sintaxis para los iteradores en Java (sintaxis algo similar en C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Lo cual tiene sentido. Aquí está la sintaxis equivalente en Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Pensé que se suponía que las Excepciones debían usarse solo en, bueno, circunstancias excepcionales.
¿Por qué Python usa excepciones para detener la iteración?
python
language-design
exceptions
iterator
NullUserException
fuente
fuente

Respuestas:
Hay una forma muy pitónica de escribir esa expresión sin escribir explícitamente un bloque try-except para un
StopIteration:Puede leer sobre las PEP relevantes 234 255 si desea saber más sobre por qué
StopIterationse introdujo y la lógica detrás de los iteradores.Un principio general en python es tener una forma de hacer algo (ver
import this), y preferiblemente es hermoso, explícito, legible y simple, que satisface el método pitónico. Su código equivalente solo es necesario ya que python no le da a los iteradores unahasNextfunción miembro; prefiriendo que las personas simplemente recorran los iteradores directamente (y si necesita hacer algo más, simplemente intente leerlo y detectar una excepción).Esta captura automática de una
StopIterationexcepción al final de un iterador tiene sentido y es un análogo de laEOFErrorprovocada si lee más allá del final del archivo.fuente
lista a nolistiteratortiene sentido. Me quedé con la primera línea sólo para seguir el punto de partida de NullUserException, para explicar cómo se debe reproducirse sobre un iterador, que es la misma forma en que debe reproducirse a través de cualquier iterable (list,set,str,tuple,dict,file,generator, etc.). Podría haber hecho algo comoit = itertools.combinations("ABCDE", 2)obtener un mejor ejemplo de un iterador significativo.it = iter(sequence)no es necesario.iterators) y es necesarioitergenerar explícitamente uniterator(trytype([])(list) vstype(iter([]))(listiterator)).La razón por la cual Python usa una excepción para detener una iteración está documentada en PEP 234 :
Nota: la forma idiomática de Python de recorrer una secuencia es así:
fuente
Es una diferencia en filosofía. La filosofía de diseño Pythonic es EAFP :
fuente
Es solo que la implementación de Java tiene un
hasNext()método para que pueda verificar si hay un iterador vacío antes de realizar unnext(). Cuando llamanext()a un iterador Java sin elementos restantes,NoSuchElementExceptionse emite un .Así que efectivamente, puedes hacer un try..catch en Java como try..except en Python. Y sí, según una respuesta anterior, la filosofía es muy importante en el mundo pitónico.
fuente