Oto składnia iteratorów w Javie (nieco podobna składnia w C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Co ma sens. Oto równoważna składnia w Pythonie:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Myślałem, że wyjątki powinny być stosowane tylko w wyjątkowych okolicznościach.
Dlaczego Python używa wyjątków, aby zatrzymać iterację?
python
language-design
exceptions
iterator
NullUserException
źródło
źródło
Odpowiedzi:
Istnieje bardzo Pythoniczny sposób na napisanie tego wyrażenia bez jawnego pisania bloku try-wyjątkiem dla
StopIteration
:Możesz przeczytać o odpowiednich dokumentach PEP 234 255, jeśli chcesz dowiedzieć się więcej o przyczynach
StopIteration
wprowadzenia i logice iteratorów.Ogólną zasadą w pythonie jest posiadanie jednego sposobu zrobienia czegoś (patrz
import this
), a najlepiej jego piękna, wyraźna, czytelna i prosta metoda, którą spełnia metoda pythonowa. Twój równoważny kod jest konieczny tylko dlatego, że Python nie daje iteratoromhasNext
funkcji członka; wolę, aby ludzie po prostu bezpośrednio przechodzili przez iteratory (a jeśli musisz zrobić coś innego, po prostu spróbuj je przeczytać i złapać wyjątek).Automatyczne przechwytywanie
StopIteration
wyjątku na końcu iteratora ma sens i jest analogią doEOFError
podniesionego, jeśli czytasz poza koniec pliku.źródło
list
na alistiterator
jest bezcelowa. Ciągle pierwszą linię tylko podążać za punkt wyjścia NullUserException, aby wyjaśnić, w jaki sposób powinien pętli nad iteratora, który jest taki sam sposób, w jaki powinien pętla nad każdym iterable (list
,set
,str
,tuple
,dict
,file
,generator
, itd.). Mógłbym zrobić coś takiego,it = itertools.combinations("ABCDE", 2)
aby uzyskać lepszy przykład znaczącego iteratora.it = iter(sequence)
nie jest potrzebne.iterators
) i musisziter
jawnie wygenerowaćiterator
(trytype([])
(list
) vstype(iter([]))
(listiterator
)).Powód, dla którego Python używa wyjątku do zatrzymania iteracji, jest udokumentowany w PEP 234 :
Uwaga: idiomatyczny sposób Pythona do zapętlania sekwencji jest następujący:
źródło
To różnica w filozofii. Filozofią projektowania Python jest EAFP :
źródło
Po prostu implementacja Java ma
hasNext()
metodę umożliwiającą sprawdzenie pustego iteratora przed wykonaniemnext()
. Gdy wywołujesznext()
iterator Java bez pozostawionych elementów,NoSuchElementException
generowane jest a .Tak skutecznie możesz wykonać try..catch w Javie jak try..except w Pythonie. I tak, zgodnie z poprzednią odpowiedzią, filozofia jest bardzo ważna w świecie Python.
źródło