Iteration ist ein allgemeiner Begriff, um jeden Gegenstand von etwas nacheinander zu nehmen. Jedes Mal, wenn Sie eine explizite oder implizite Schleife verwenden, um eine Gruppe von Elementen zu durchlaufen, dh Iteration.
In Python haben iterable und iterator bestimmte Bedeutungen.
Eine iterable ist ein Objekt mit einer __iter__
Methode, die einen Iterator zurückgibt oder die eine __getitem__
Methode definiert , die sequentielle Indizes ab Null annehmen kann (und eine auslöst, IndexError
wenn die Indizes nicht mehr gültig sind). Ein Iterable ist also ein Objekt, von dem Sie einen Iterator erhalten können .
Ein Iterator ist ein Objekt mit einer next
(Python 2) - oder __next__
(Python 3) -Methode.
Immer wenn Sie in Python eine for
Schleife map
oder ein Listenverständnis usw. verwenden, wird die next
Methode automatisch aufgerufen, um jedes Element vom Iterator abzurufen und so den Iterationsprozess zu durchlaufen .
Ein guter Ort, um mit dem Lernen zu beginnen, ist der Abschnitt mit den Iteratoren des Lernprogramms und der Abschnitt mit den Iteratortypen auf der Seite mit den Standardtypen . Nachdem Sie die Grundlagen verstanden haben, probieren Sie den Abschnitt Iteratoren des HOWTO zur funktionalen Programmierung aus .
collections.abc.AsyncIterator
Tests für__aiter__
und__anext__
Methoden. Dies ist eine neue Ergänzung in 3.6.__len__
sollte unbedingt mit Iteration verbunden sein? Wie würde es Ihnen helfen, die Länge von etwas zu kennen, um darüber nachzudenken?__getitem__
.{'a': 'hi', 'b': 'bye'}
eine Länge von 2 hat, aber nicht durch 0, 1 oder 2 indiziert werden kann.__iter__
Methode. Ich denke, jlh bezieht sich auf Objekte, die spezifisch iterierbar sind, weil sie definieren: "Eine__getitem__
Methode, die sequentielle Indizes ab Null annehmen kann".Hier ist die Erklärung, die ich beim Unterrichten von Python-Klassen verwende:
Ein ITERABLE ist:
for x in iterable: ...
oderiter()
, gibt einen ITERATOR zurück:iter(obj)
oder__iter__
dass ein neuer ITERATOR zurückgegeben wird, oder eine__getitem__
Methode, die für die indizierte Suche geeignet ist.Ein ITERATOR ist ein Objekt:
__next__
Methode, die:StopIteration
__iter__
Methode gibt, die zurückgibtself
).Anmerkungen:
__next__
Methode in Python 3 wirdnext
in Python 2 und geschriebennext()
ruft diese Methode für das an sie übergebene Objekt auf.Zum Beispiel:
quelle
for
Schleifen handelt und bei der ersten Kugel um "Schleifen". Könnten Sie diese bitte ansprechen?iter()
" als "alles, an das Sie weitergeben könneniter()
"Die obigen Antworten sind großartig, aber wie das meiste, was ich gesehen habe, betonen Sie die Unterscheidung nicht genug für Leute wie mich.
Außerdem neigen Menschen dazu, "zu pythonisch" zu werden, indem sie zuvor Definitionen wie "X ist ein Objekt mit
__foo__()
Methode" setzen. Solche Definitionen sind korrekt - sie basieren auf der Philosophie der Ententypisierung, aber der Fokus auf Methoden liegt tendenziell dazwischen, wenn versucht wird, das Konzept in seiner Einfachheit zu verstehen.Also füge ich meine Version hinzu.
In natürlicher Sprache
In Python
iterable ist ein Objekt, das iterable ist, was einfach ausgedrückt bedeutet, dass es in der Iteration verwendet werden kann, z
for
. B. mit einer Schleife. Wie? Mit dem Iterator . Ich werde unten erklären.... während der Iterator ein Objekt ist, das definiert, wie die Iteration tatsächlich durchgeführt wird - insbesondere, was das nächste Element ist. Deshalb muss es
next()
Methode haben.Iteratoren sind selbst auch iterierbar, mit dem Unterschied, dass ihre
__iter__()
Methode dasselbe Objekt (self
) zurückgibt , unabhängig davon, ob ihre Elemente von früheren Aufrufen an verbraucht wurden oder nichtnext()
.Was denkt der Python-Interpreter, wenn er eine
for x in obj:
Aussage sieht ?Da Mr.
obj
diesen Test erfolgreich abgeschlossen hat (indem eine bestimmte Methode einen gültigen Iterator zurückgibt), belohnen wir ihn mit einem Adjektiv: Sie können ihn jetzt "iterable Mr.obj
" nennen.In einfachen Fällen profitieren Sie jedoch normalerweise nicht davon, dass Iterator und Iterator separat verfügbar sind. Sie definieren also nur ein Objekt, das auch ein eigener Iterator ist. (Python ist es eigentlich egal, dass
_i
das, was vonobj
ausgegeben wurde, nicht so glänzend war, sondern nur dasobj
selbst.)Aus diesem Grund können Sie in den meisten Beispielen, die ich gesehen habe (und was mich immer wieder verwirrt hat), Folgendes sehen:
anstatt
Es gibt jedoch Fälle, in denen Sie davon profitieren können, dass der Iterator vom iterablen getrennt wird, z. B. wenn Sie eine Reihe von Elementen, aber mehr "Cursor" haben möchten. Wenn Sie beispielsweise mit "aktuellen" und "bevorstehenden" Elementen arbeiten möchten, können Sie für beide separate Iteratoren verwenden. Oder mehrere Threads, die aus einer riesigen Liste gezogen werden: Jeder kann seinen eigenen Iterator haben, um alle Elemente zu durchlaufen. Siehe die Antworten von @ Raymond und @ glglgl oben.
Stellen Sie sich vor, was Sie tun könnten:
Anmerkungen:
Ich wiederhole noch einmal: Iterator ist nicht iterierbar . Der Iterator kann nicht als "Quelle" in einer
for
Schleife verwendet werden. Was diefor
Schleife hauptsächlich benötigt, ist__iter__()
(das gibt etwas mit zurücknext()
).Natürlich
for
ist dies nicht die einzige Iterationsschleife, daher gilt das oben Gesagte auch für einige andere Konstrukte (while
...).Iteratoren
next()
können StopIteration auslösen, um die Iteration zu stoppen. Muss aber nicht, es kann für immer iterieren oder andere Mittel verwenden.Im obigen "Denkprozess"
_i
existiert nicht wirklich. Ich habe diesen Namen erfunden.Es gibt eine kleine Änderung in Python 3.x: Die
next()
Methode (nicht die eingebaute) muss jetzt aufgerufen werden__next__()
. Ja, das hätte die ganze Zeit so sein sollen.Sie können sich das auch so vorstellen: iterable hat die Daten, iterator zieht das nächste Element
Haftungsausschluss: Ich bin kein Entwickler eines Python-Interpreters, daher weiß ich nicht genau, was der Interpreter "denkt". Die obigen Überlegungen zeigen lediglich, wie ich das Thema anhand anderer Erklärungen, Experimente und realer Erfahrungen eines Python-Neulings verstehe.
quelle
for
Schleife einen Iterator benötigt ("Schauen Sie, eine for-Schleife. Sieht aus wie ein Job für einen Iterator ... Lassen Sie uns einen bekommen."). Aber dann sagen Sie in den Anmerkungen am Ende, dass "Iterator nicht als Quelle in einerfor
Schleife verwendet werden kann" ...?pass
den Code für diesenext
Definitionen ein? Ich gehe davon aus, dass Sie nur meinen, dass jemand einen Weg implementieren muss, um den nächsten zu erhalten, da der nächste etwas zurückgeben muss.pass
pass
, denke ich, dass es aus syntaktischen Gründen da ist. Ich bin gerade auf die Antworten am Auslassungsobjekt gestoßen, die sehr interessant sind: Sie können...
einen Block "später erledigen" angeben.NotImplemented
ist ebenfalls verfügbar.for
Schleife verwendet werden. Ich verstehe den Punkt Ihrer Antwort und mag es anders, aber ich denke, es würde davon profitieren, dies zu beheben.Ein iterable ist ein Objekt, das eine
__iter__()
Methode hat. Es kann möglicherweise mehrmals wiederholt werden, z. B.list()
s undtuple()
s.Ein Iterator ist das Objekt, das iteriert. Es wird von einer
__iter__()
Methode zurückgegeben, gibt sich über eine eigene__iter__()
Methode zurück und verfügt über einenext()
Methode (__next__()
in 3.x).Iteration ist der Prozess, bei dem dies
next()
bzw.__next__()
bis es steigtStopIteration
.Beispiel:
quelle
Iterable
.Iterator
ist immerIterable
und ist sein eigenesIterator
, zwei Anrufe voniter()
geben nicht notwendigerweise zwei unabhängigeIterator
s.Hier ist mein Spickzettel:
Quiz: Sehen Sie wie ...
__iter__()
Methode eines Containerobjekts kann als Generator implementiert werden.__next__
Methode ist nicht unbedingt ein Iterator?Antworten:
__iter__
Methode haben. Haben__iter__
ist genug, um iterierbar zu sein. Daher ist jeder Iterator iterierbar.Wenn
__iter__
es aufgerufen wird, sollte es einen Iterator zurückgeben (return <iterator>
im obigen Diagramm). Das Aufrufen eines Generators gibt einen Generatoriterator zurück, der eine Art Iterator ist.Hier ist ein Beispiel:
quelle
__iter__
Methode. Können Sie bitte den 2. und 3. Punkt__iter__()
einen Iterator zurück. Ein Generator ist ein Iterator, daher kann er für diesen Zweck verwendet werden. Zu 3.: Ich kann hier nur raten, aber ich denke, wenn__iter__()
es fehlt oder nicht zurückkehrtself
, ist es kein Iterator, weil ein Iterator__iter__()
zurückkehren mussself
.Ich weiß nicht, ob es jemandem hilft, aber ich mag es immer, Konzepte in meinem Kopf zu visualisieren, um sie besser zu verstehen. Da ich einen kleinen Sohn habe, visualisiere ich das iterable / iterator-Konzept mit Bausteinen und Whitepaper.
Angenommen, wir sind im dunklen Raum und auf dem Boden haben wir Ziegel für meinen Sohn. Steine unterschiedlicher Größe und Farbe spielen jetzt keine Rolle mehr. Angenommen, wir haben 5 solche Steine. Diese 5 Steine können als Objekt beschrieben werden - sagen wir mal Steinbausatz . Wir können mit diesem Baustein-Kit viele Dinge tun - können einen nehmen und dann den zweiten und dann den dritten nehmen, die Ziegelplätze wechseln, den ersten Ziegel über den zweiten legen. Damit können wir viele Dinge tun. Daher ist dieses Baustein-Kit ein iterierbares Objekt oder eine iterierbare Sequenz, da wir jeden Baustein durchgehen und etwas damit tun können. Wir können es wie mein kleiner Sohn nur tun - wir können mit spielen ein Ziegel auf einmal . Also wieder stelle ich mir dieses Bricks-Kit als ein voriterierbar .
Denken Sie jetzt daran, dass wir im dunklen Raum sind. Oder fast dunkel. Die Sache ist, dass wir diese Steine nicht klar sehen, welche Farbe sie haben, welche Form usw. Selbst wenn wir etwas mit ihnen machen wollen - auch bekannt als Iteration durch sie -, wissen wir nicht wirklich was und wie, weil es so ist zu dunkel.
Was wir tun können, ist in der Nähe des ersten Ziegels - als Element eines Ziegelbausatzes - wir können ein Stück weißes fluoreszierendes Papier einlegen, damit wir sehen können, wo sich das erste Ziegelelement befindet. Und jedes Mal, wenn wir einen Ziegelstein aus einem Bausatz nehmen, ersetzen wir das weiße Stück Papier durch einen nächsten Ziegelstein, um dies im dunklen Raum sehen zu können. Dieses weiße Stück Papier ist nichts weiter als ein Iterator . Es ist auch ein Objekt . Aber ein Objekt mit dem, was wir mit Elementen unseres iterierbaren Objekts arbeiten und spielen können - Bricks Kit.
Das erklärt übrigens meinen frühen Fehler, als ich Folgendes in einem IDLE versuchte und einen TypeError bekam:
Liste X hier war unser Ziegelset, aber KEIN weißes Stück Papier. Ich musste zuerst einen Iterator finden:
Ich weiß nicht, ob es hilft, aber es hat mir geholfen. Wenn jemand die Visualisierung des Konzepts bestätigen / korrigieren könnte, wäre ich dankbar. Es würde mir helfen, mehr zu lernen.
quelle
Iterierbar : - etwas, das iterierbar ist, ist iterierbar; wie Sequenzen wie Listen, Strings usw. Auch hat es entweder die
__getitem__
Methode oder eine__iter__
Methode. Wenn wir nun dieiter()
Funktion für dieses Objekt verwenden, erhalten wir einen Iterator.Iterator : - Wenn wir das Iteratorobjekt von der
iter()
Funktion erhalten; Wir rufen die__next__()
Methode (in Python3) oder einfachnext()
(in Python2) auf, um die Elemente einzeln abzurufen. Diese Klasse oder Instanz dieser Klasse wird als Iterator bezeichnet.Aus Dokumenten: -
Die Verwendung von Iteratoren durchdringt und vereinheitlicht Python. Hinter den Kulissen ruft die for-Anweisung
iter()
das Containerobjekt auf. Die Funktion gibt ein Iteratorobjekt zurück, das die Methode definiert,__next__()
die einzeln auf Elemente im Container zugreift. Wenn keine weiteren Elemente vorhanden sind, wird__next__()
eine StopIteration-Ausnahme ausgelöst, die die for-Schleife zum Beenden anweist. Sie können die__next__()
Methode mit dernext()
integrierten Funktion aufrufen . Dieses Beispiel zeigt, wie alles funktioniert:Ex einer Klasse: -
quelle
Ich denke nicht, dass Sie es viel einfacher als die Dokumentation bekommen können , aber ich werde versuchen:
Sie können sich Iterator als eine Hilfspseudomethode (oder ein Pseudoattribut) vorstellen, die das nächste (oder erste) Element in der Iterable angibt (oder enthält) . (In der Praxis ist es nur ein Objekt, das die Methode definiert.
next()
)Die Iteration lässt sich wahrscheinlich am besten durch die Merriam-Webster- Definition des Wortes erklären :
quelle
damit,
iterable
ist ein Objekt , das durchlaufen werden kann . zB Liste, String, Tupel etc.Wenn Sie die
iter
Funktion für unseriterable
Objekt verwenden, wird ein Iteratorobjekt zurückgegeben.Jetzt hat dieses Iteratorobjekt eine Methode namens
__next__
(in Python 3 oder nurnext
in Python 2), mit der Sie auf jedes Element von iterable zugreifen können.Die Ausgabe des oben genannten Codes lautet also:
1
2
quelle
Luciano Ramalho, fließender Python.
quelle
Vor dem Umgang mit den Iterablen und dem Iterator ist die Sequenz der Hauptfaktor, der über die Iterablen und den Iterator entscheidet
Sequenz: Sequenz ist die Sammlung von Daten
Iterable: Iterable sind die Objekte vom Sequenztyp, die die
__iter__
Methode unterstützen.Iter-Methode: Die Iter-Methode nimmt die Sequenz als Eingabe und erstellt ein Objekt, das als Iterator bezeichnet wird
Iterator: Iterator sind die Objekte, die die nächste Methode aufrufen und die Sequenz durchlaufen. Beim Aufrufen der nächsten Methode wird das aktuell durchlaufene Objekt zurückgegeben.
Beispiel:
x ist eine Sequenz, die aus der Sammlung von Daten besteht
Beim Aufrufen
iter(x)
wird nur dann ein Iterator zurückgegeben, wenn das x-Objekt über eine iter-Methode verfügt. Andernfalls wird eine Ausnahme ausgelöst. Wenn es einen Iterator zurückgibt, wird y wie folgt zugewiesen:Da y ein Iterator ist, unterstützt es die
next()
MethodeBeim Aufruf der nächsten Methode werden die einzelnen Elemente der Liste nacheinander zurückgegeben.
Wenn wir nach der Rückgabe des letzten Elements der Sequenz die nächste Methode erneut aufrufen, wird ein StopIteration-Fehler ausgelöst
Beispiel:
quelle
In Python ist alles ein Objekt. Wenn ein Objekt als iterierbar bezeichnet wird, bedeutet dies, dass Sie das Objekt als Sammlung durchlaufen (dh iterieren) können.
Arrays zum Beispiel sind iterierbar. Sie können sie mit einer for-Schleife durchlaufen und von Index 0 zu Index n wechseln, wobei n die Länge des Array-Objekts minus 1 ist.
Wörterbücher (Schlüssel / Wert-Paare, auch assoziative Arrays genannt) können ebenfalls iteriert werden. Sie können durch ihre Schlüssel treten.
Offensichtlich sind die Objekte, die keine Sammlungen sind, nicht iterierbar. Ein Bool-Objekt hat beispielsweise nur einen Wert, True oder False. Es ist nicht iterierbar (es würde keinen Sinn machen, dass es ein iterierbares Objekt ist).
Weiterlesen. http://www.lepus.org.uk/ref/companion/Iterator.xml
quelle
iter()
der Standardauflistungstypen erstellt wurden, sind iterierbar, aber selbst keine Sammlungen.