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é
StopIteration
se 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 unahasNext
funció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
StopIteration
excepción al final de un iterador tiene sentido y es un análogo de laEOFError
provocada si lee más allá del final del archivo.fuente
list
a a nolistiterator
tiene 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 necesarioiter
generar 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,NoSuchElementException
se 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