Vielleicht bin ich Opfer von Fehlinformationen im Internet geworden, aber ich denke, es ist wahrscheinlicher, dass ich etwas falsch verstanden habe. Basierend auf dem, was ich bisher gelernt habe, ist range () ein Generator, und Generatoren können als Iteratoren verwendet werden. Dieser Code jedoch:
myrange = range(10)
print(next(myrange))
gibt mir diesen Fehler:
TypeError: 'range' object is not an iterator
Was vermisse ich hier? Ich hatte erwartet, dass dies 0 druckt und zum nächsten Wert in weitergeht myrange
. Ich bin neu in Python. Bitte entschuldigen Sie die eher grundlegende Frage, aber ich konnte nirgendwo anders eine gute Erklärung finden.
for
Schleife iterieren können .iter
mit denen ein Iterator abgerufen werden kann. Iteratoren sind Objekte, die mithilfe von iteriert werden könnennext
. Generatoren ist eine Kategorie von Iteratoren (Generatorfunktionen und Generatorausdrücke). Zumindest denke ich das ...Antworten:
range
ist eine Klasse unveränderlicher iterierbarer Objekte. Ihr Iterationsverhalten kann mitlist
s verglichen werden : Sie können sie nichtnext
direkt aufrufen ; Sie müssen einen Iterator mit verwendeniter
.Also nein,
range
ist kein Generator.Sie denken vielleicht: "Warum haben sie es nicht direkt iterierbar gemacht?" Nun,
range
wir haben einige nützliche Eigenschaften, die auf diese Weise nicht möglich wären:start
,stop
undstep
Attribute (seit Python 3.3),count
undindex
Methoden , und sie unterstützenin
,len
und__getitem__
Operationen.range
mehrmals durchlaufen .>>> myrange = range(1, 21, 2) >>> myrange.start 1 >>> myrange.step 2 >>> myrange.index(17) 8 >>> myrange.index(18) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 18 is not in range >>> it = iter(myrange) >>> it <range_iterator object at 0x7f504a9be960> >>> next(it) 1 >>> next(it) 3 >>> next(it) 5
quelle
range
Objekten ist, dass sie eine__contains__
Methode haben , mit der getestet werden kann, ob ein Wert in einem Bereich liegt:5 in range(10) => True
range
ist faul ( im Vergleich zu Python 2 , wo es nur eine Funktion , dass die Rendite einer Liste).range(0,10,3)[3]
und9 in range(0,10,3)
. Reichweite ist so ziemlich eine faule Liste.