Aqui está a sintaxe para iteradores em Java (sintaxe semelhante em C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
O que faz sentido. Aqui está a sintaxe equivalente no Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Eu pensei que as exceções deveriam ser usadas apenas em circunstâncias excepcionais.
Por que o Python usa exceções para interromper a iteração?
python
language-design
exceptions
iterator
NullUserException
fonte
fonte
Respostas:
Existe uma maneira muito pitônica de escrever essa expressão sem escrever explicitamente um bloco try-exceto para um
StopIteration
:Você pode ler as PEPs relevantes 234 255 se quiser saber mais sobre o porquê de ter
StopIteration
sido introduzido e a lógica por trás dos iteradores.Um princípio geral em python é ter uma maneira de fazer alguma coisa (ver
import this
) e, de preferência, ser bonito, explícito, legível e simples, o que o método pitônico satisfaz. Seu código equivalente é necessário apenas porque o python não fornece aos iteradores umahasNext
função de membro; preferindo que as pessoas passem pelos iteradores diretamente (e se você precisar fazer outra coisa, tente ler e capturar uma exceção).Essa captura automática de uma
StopIteration
exceção no final de um iterador faz sentido e é um análogo doEOFError
gerado se você ler além do final do arquivo.fonte
list
para alistiterator
é inútil. Eu mantive a primeira linha apenas para seguir o ponto de partida do NullUserException, para explicar como você deve loop sobre um iterador, que é a mesma maneira que você deve loop sobre qualquer iterable (list
,set
,str
,tuple
,dict
,file
,generator
, etc.). Eu poderia ter feito algo parecidoit = itertools.combinations("ABCDE", 2)
para obter um exemplo melhor de um iterador significativo.it = iter(sequence)
Não é necessário.iterators
) e você precisaiter
gerar explicitamente umiterator
(trytype([])
(list
) vstype(iter([]))
(listiterator
)).O motivo pelo qual o python usa uma exceção para interromper uma iteração está documentado no PEP 234 :
Nota: a maneira idiomática do python para fazer um loop sobre uma sequência é assim:
fonte
É uma diferença na filosofia. A filosofia de design Pythonic é EAFP :
fonte
Só que a implementação Java possui um
hasNext()
método para que você possa procurar um iterador vazio antes de executar umnext()
. Quando você chamanext()
um iterador Java sem nenhum elemento restante, aNoSuchElementException
é lançada .Tão eficazmente, você pode fazer uma tentativa ... capturar em Java como a tentativa ... exceto em Python. E sim, de acordo com uma resposta anterior, a filosofia é muito importante no mundo pitonico.
fonte