Вот синтаксис для итераторов в Java (несколько похожий синтаксис в C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Что имеет смысл. Вот эквивалентный синтаксис в Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Я думал, что исключения должны были использоваться только в исключительных обстоятельствах.
Почему Python использует исключения для остановки итерации?
python
language-design
exceptions
iterator
NullUserException
источник
источник
Ответы:
Есть очень Pythonic способ написать это выражение без явной записи блока try-Кроме
StopIteration
:Вы можете прочитать соответствующие PEP 234 255, если хотите узнать больше о том, почему он
StopIteration
был представлен, и о логике итераторов.Общий принцип в python - иметь один способ что-то сделать (см.
import this
), И, предпочтительно, его красивый, явный, читаемый и простой, который удовлетворяет метод pythonic. Ваш эквивалентный код необходим только потому, что python не предоставляет итераторам функцию-hasNext
член; предпочитая, чтобы люди просто перебирали итераторы напрямую (и, если вам нужно сделать что-то еще, просто попробуйте прочитать это и поймать исключение).Этот автоматический перехват
StopIteration
исключения в конце итератора имеет смысл и является аналогомEOFError
повышенного значения, если вы читаете за концом файла.источник
list
в alistiterator
бессмысленно. Я сохранил первую строчку только следовать за отправную точкой NullUserException, в объяснить , как вы должны перебирает итератор, который является таким же образом , вы должны перебирает любую итерацию (list
,set
,str
,tuple
,dict
,file
,generator
и т.д.). Я мог бы сделать что-то вродеit = itertools.combinations("ABCDE", 2)
лучшего примера значимого итератора.it = iter(sequence)
не нуженiterators
), и вам нужноiter
явно сгенерироватьiterator
(trytype([])
(list
) vstype(iter([]))
(listiterator
)).Причина, по которой python использует исключение для остановки итерации, задокументирована в PEP 234 :
Примечание: идиоматический способ прохождения последовательности по Python выглядит так:
источник
Это разница в философии. Философия дизайна Pythonic - это EAFP :
источник
Просто у реализации Java есть
hasNext()
метод, так что вы можете проверить наличие пустого итератора перед выполнениемnext()
. Когда вы делаете вызовnext()
на итераторе Java без каких - либо элементов , Влево,NoSuchElementException
отбрасываются .Таким образом, вы можете сделать try..catch в Java, как try..except в Python. И да, согласно предыдущему ответу, философия очень важна в мире Pythonic.
источник