Hier ist die Syntax für Iteratoren in Java (etwas ähnliche Syntax in C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Welches macht Sinn. Hier ist die äquivalente Syntax in Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Ich dachte, Ausnahmen sollten nur unter außergewöhnlichen Umständen verwendet werden.
Warum verwendet Python Ausnahmen, um die Iteration zu stoppen?
python
language-design
exceptions
iterator
NullUserException
quelle
quelle
Antworten:
Es gibt eine sehr pythonische Möglichkeit, diesen Ausdruck zu schreiben, ohne explizit einen try-except-Block für a zu schreiben
StopIteration
:Sie können sich über die relevanten PEPs 234 255 informieren, wenn Sie mehr darüber wissen möchten, warum sie
StopIteration
eingeführt wurden und welche Logik hinter Iteratoren steckt.Ein allgemeines Prinzip in Python besteht darin, eine Möglichkeit zu haben, etwas zu tun (siehe
import this
), und vorzugsweise eine schöne, explizite, lesbare und einfache, die die pythonische Methode erfüllt. Ihr entsprechender Code ist nur erforderlich, da Python Iteratoren keinehasNext
Member-Funktion gibt. Es ist vorzuziehen, die Iteratoren direkt durchzugehen (und wenn Sie etwas anderes tun müssen, um es einfach zu lesen und eine Ausnahme zu erkennen).Dieses automatische Abfangen einer
StopIteration
Ausnahme am Ende eines Iterators ist sinnvoll und entspricht demEOFError
Auslösen, wenn Sie nach einem Dateiende lesen.quelle
list
in alistiterator
sinnlos. Ich hielt die erste Zeile nur NullUserException der Ausgangspunkt zu folgen, zu erklären , wie Sie sollten Schleife über einen Iterator, der die gleiche Art und Weise ist , sollten Sie eine Schleife über jede iterable (list
,set
,str
,tuple
,dict
,file
,generator
, etc.). Ich hätte etwas tun könnenit = itertools.combinations("ABCDE", 2)
, um ein besseres Beispiel für einen aussagekräftigen Iterator zu erhalten.it = iter(sequence)
wird nicht gebraucht.iterators
) zu folgen, und Sie müsseniter
explizit einiterator
(trytype([])
(list
) vstype(iter([]))
(listiterator
)) generieren .Der Grund, warum Python eine Ausnahme verwendet, um eine Iteration zu stoppen, ist in PEP 234 dokumentiert :
Hinweis: Die idiomatische Python-Methode zum Durchlaufen einer Sequenz sieht folgendermaßen aus:
quelle
Es ist ein Unterschied in der Philosophie. Die Pythonic-Designphilosophie lautet EAFP :
quelle
Es ist nur so, dass die Java-Implementierung eine
hasNext()
Methode hat, mit der Sie nach einem leeren Iterator suchen können, bevor Sie eine ausführennext()
. Wenn Sienext()
einen Java-Iterator aufrufen, der keine Elemente mehr enthält,NoSuchElementException
wird a geworfen .So effektiv können Sie in Java einen try..catch ausführen wie in try..except in Python. Und ja, nach einer früheren Antwort ist Philosophie in der pythonischen Welt sehr wichtig.
quelle