Voici la syntaxe pour les itérateurs en Java (syntaxe quelque peu similaire en C #):
Iterator it = sequence.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Ce qui a du sens. Voici la syntaxe équivalente en Python:
it = iter(sequence)
while True:
try:
value = it.next()
except StopIteration:
break
print(value)
Je pensais que les exceptions n'étaient censées être utilisées que dans des circonstances exceptionnelles.
Pourquoi Python utilise-t-il des exceptions pour arrêter les itérations?
python
language-design
exceptions
iterator
NullUserException
la source
la source
Réponses:
Il existe un moyen très pythonique d'écrire cette expression sans écrire explicitement un bloc try-except pour un
StopIteration
:Vous pouvez en savoir plus sur les PEP 234 255 pertinents si vous souhaitez en savoir plus sur la raison de l’
StopIteration
introduction de cette stratégie et sur la logique qui sous-tend les itérateurs.Un principe général en python est d’avoir un moyen de faire quelque chose (voir
import this
), et de préférence son beau, explicite, lisible et simple, que la méthode pythonique satisfait. Votre code équivalent est uniquement nécessaire car python ne donne pas aux itérateurs unehasNext
fonction membre; préférant que les utilisateurs fassent simplement une lecture directe des itérateurs (et si vous avez besoin de faire autre chose, essayez simplement de le lire et d’obtenir une exception).Cette interception automatique d'une
StopIteration
exception à la fin d'un itérateur a du sens et est analogue auEOFError
levé si vous lisez au-delà de la fin du fichier.la source
list
en alistiterator
est donc inutile. J'ai gardé la première ligne que de suivre le point de départ de NullUserException, pour expliquer comment vous devriez boucler sur un itérateur, ce qui est de la même façon que vous devriez boucler sur tout itérable (list
,set
,str
,tuple
,dict
,file
,generator
, etc.). J'aurais pu faire quelque chose commeit = itertools.combinations("ABCDE", 2)
obtenir un meilleur exemple d'un itérateur significatif.it = iter(sequence)
n'est pas nécessaire.iterators
) et vous deveziter
générer explicitement uniterator
(trytype([])
(list
) vstype(iter([]))
(listiterator
)).La raison pour laquelle python utilise une exception pour arrêter une itération est documentée dans PEP 234 :
Remarque: la méthode idiomatique utilisée pour boucler une séquence est la suivante:
la source
C'est une différence de philosophie. La philosophie de conception Pythonic est l’ EAFP :
la source
C'est juste que l'implémentation Java a une
hasNext()
méthode pour que vous puissiez rechercher un itérateur vide avant d'effectuer unenext()
. Lorsque vous appeleznext()
un itérateur Java sans aucun élément, unNoSuchElementException
est lancé .Tellement efficacement, vous pouvez faire un try..catch en Java comme le try..except en Python. Et oui, comme dans une réponse précédente, la philosophie est très importante dans le monde pythonique.
la source