In Python ist ein Iterator jedes Objekt, das das Iteratorprotokoll unterstützt. Teil dieses Protokolls ist, dass das Objekt eine __iter__()
-Methode haben muss, die das Iterator-Objekt zurückgibt. Ich nehme an, dies gibt Ihnen eine gewisse Flexibilität, so dass ein Objekt die Iterator-Verantwortlichkeiten an eine interne Klasse weitergeben oder ein spezielles Objekt erstellen kann. Auf jeden Fall hat die __iter__()
Verfahren in der Regel nur eine Zeile und diese Linie ist oft einfach return self
Der andere Teil des Protokolls ist die next()
Methode, und das ist, wo die eigentliche Arbeit erledigt ist. Diese Methode muss herausfinden oder erstellen oder die nächste Sache bekommen und es zurückgeben. Es muss möglicherweise nachverfolgen, wo es ist, damit es beim nächsten Aufruf das nächste Ding zurückgibt.
Wenn Sie ein Objekt haben, das nächste, was in einer Sequenz zurückgibt, können Sie eine for-Schleife kollabieren, die wie folgt aussieht:
myname = "Fredericus"
x = []
for i in [1,2,3,4,5,6,7,8,9,10]:
x.append(myname[i-1])
i = i + 1 # get the next i
print x
in diese:
myname = "Fredericus"
x = [myname[i] for i in range(10)]
print x
Hinweis, dass es Nirgendwo, wo wir Code haben, der den nächsten Wert von i erhält, weil Bereich (10) ein Objekt ist, das das Iteratorprotokoll FOLGT, und das Listenverständnis ist ein Konstrukt, das das Iteratorprotokoll VERWENDET.
Sie können das Iteratorprotokoll auch direkt verwenden. Zum Beispiel, wenn das Schreiben von Skripts CSV-Dateien zu verarbeiten, schreibe ich oft diese:
mydata = csv.reader(open('stuff.csv')
mydata.next()
for row in mydata:
# do something with the row.
Ich bin mit dem Iterator direkt von next()
Aufruf der Kopfzeile überspringen, dann indirekt über den eingebauten in
Operator in den for
mit Erklärung.
Welche Kapitel des Buchs? Das wird uns helfen, die Quelle Ihrer Verwirrung einzugrenzen. –
Lernen Python Kapitel 24 Seite 493 - 495 – sss
Wenn Sie in der Standardbibliothek Dokumentation itertools Modul suchen, werden Sie eine Reihe von Funktionen finden, die die __iter __() -Methode benötigen. –