Ich studiere Alex Martelis Python auf den Punkt gebracht und das Buch schlägt vor, dass jedes Objekt, das eine next()
Methode hat, ein Iterator ist (oder zumindest als Iterator verwendet werden kann) . Es wird auch vorgeschlagen, dass die meisten Iteratoren durch implizite oder explizite Aufrufe einer aufgerufenen Methode erstellt werden iter
.
Nachdem ich dies in dem Buch gelesen hatte, verspürte ich den Drang, es zu versuchen. Ich habe einen Python 2.7.3-Interpreter gestartet und dies getan:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
... print x.next()
Das Ergebnis war jedoch folgendes:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'
In Verwirrung versuchte ich, die Struktur des x-Objekts über zu untersuchen, dir(x)
und bemerkte, dass es ein __iter__
Funktionsobjekt hatte. Also habe ich herausgefunden, dass es als Iterator verwendet werden kann, solange es diese Art von Schnittstelle unterstützt.
Als ich es erneut versuchte, diesmal etwas anders, versuchte ich Folgendes:
>>> _temp_iter = next(x)
Ich habe diesen Fehler erhalten:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
Aber wie kann eine Liste KEIN Iterator sein, da sie diese Schnittstelle zu unterstützen scheint und im folgenden Kontext durchaus als eine verwendet werden kann:
>>> for number in x:
... print x
Könnte mir jemand helfen, dies in meinem Kopf zu klären?
next
kehren einfach zurückself
, sodass Sieiter(iter(iter(iter(x))))
das Gleiche wie aufrufen und abrufen könneniter(x)
. Aus diesem Grundfor
funktioniert es sowohl mit Iterables als auch mit Iteratoren ohne Typ-Sniffing (ohne Berücksichtigung von Leistungsoptimierungen).