Si la fourchette() est un générateur en Python 3.3, pourquoi je ne peux pas appel à next() sur une plage?
Peut-être que j'ai été victime de la désinformation sur le web, mais je pense que c'est plus probablement que j'ai mal compris quelque chose. Selon ce que j'ai appris jusqu'à présent, range() est un générateur, et les générateurs peuvent être utilisés comme des itérateurs. Toutefois, ce code:
myrange = range(10)
print(next(myrange))
me donne cette erreur:
TypeError: 'range' object is not an iterator
Ce qui me manque ici? Je m'attendais à ce genre d'imprimer 0, et pour passer à la valeur suivante dans myrange
. Je suis nouveau sur Python, donc s'il vous plaît accepter mes excuses pour la non question de base, mais je ne pouvais pas trouver une bonne explication n'importe où ailleurs.
- Voir stackoverflow.com/q/13054057/395760 pour la distinction entre les itérateurs et les choses que vous pouvez parcourir dans un
for
boucle. - Serait-il correct de dire que les générateurs sont iterables, mais pas les itérateurs?
- Iterables sont des objets qui
iter
peut être utilisé pour obtenir un itérateur. Les itérateurs sont des objets que l'on peut parcourir par le biais de l'aidenext
. Générateurs est de la catégorie des itérateurs (générateur de fonctions et un générateur d'expressions). Au moins, c'est ce que je pense...
Vous devez vous connecter pour publier un commentaire.
range
est une classe de immuable itérable objets. Leur itération comportement peut être comparé àlist
s: vous ne pouvez pas appelernext
directement sur eux; vous devez obtenir un itérateur en utilisantiter
.Donc pas,
range
n'est pas un générateur.Vous pouvez penser, "pourquoi n'ont-ils pas le faire directement itératif"? Eh bien,
range
s ont certaines propriétés utiles qui ne serait pas possible de cette façon:start
,stop
etstep
attributs (depuis Python 3.3),count
etindex
méthodes, et ils soutiennentin
,len
et__getitem__
opérations.range
plusieurs fois.range
objets est qu'ils ont un__contains__
méthode qui peut être utilisé pour tester si une valeur est dans l'intervalle:5 in range(10) => True
range
est lazy (par rapport à Python 2 où c'est juste une fonction qui retourne une liste).range(0,10,3)[3]
et9 in range(0,10,3)
. La gamme est assez bien un paresseux liste.