Heim  >  Artikel  >  Backend-Entwicklung  >  Leicht verwirrende Konzepte in Python-Iteratoren und -Generatoren

Leicht verwirrende Konzepte in Python-Iteratoren und -Generatoren

零下一度
零下一度Original
2017-07-17 09:58:131336Durchsuche

Iteratoren und Generatoren

Iteratoren und Generatoren sind zwei Konzepte, die in Python häufig verwendet werden und leicht verwechselt werden können. Heute werde ich sie klären und einige häufig verwendete Beispiele nennen.

für Anweisung und iterierbares Objekt:

für i in [1, 2, 3]:

print(i)

obj = {"a ": 123, "b": 456}

für k in obj:

print(k)

Diese können Das in der verwendete Objekt sein Die for-Anweisung zur Schleife ist ein iterierbares Objekt. Zusätzlich zu den integrierten Datentypen (Listen, Tupel, Zeichenfolgen, Wörterbücher usw.), die durch die for-Anweisung iteriert werden können, können wir auch selbst einen Container erstellen, der eine Reihe von Elementen enthält, und jedes Element kann in einer Schleife ausgeführt werden sequentiell über die for-Anweisung ausführen. Dieser A-Container ist ein Iterator.

Die for-Schleife kann für jeden Sequenztyp in Python verwendet werden, einschließlich Sequenzen, Tupeln und Strings. Zum Beispiel:

>>> für x in [1,2,3,4]: print(x * 2,end='')
...
2468

>>> für x in (1,2,3,4): print(x * 2,end='')
...
2468

>>> für y in 'python': print(y * 2 ,end=' ')
...
pp yy tt hh oo nn

Eigentlich das for Schleife Es ist noch allgemeiner: Es kann mit jedem iterierbaren Objekt verwendet werden. Sie können sich for als Iterationstool vorstellen, und es gibt einige Beispiele: Listenparsing, Mitgliedschaftstests und integrierte Kartenfunktionen.

Datei-Iterator

Datei verfügt über eine Methode namens __next__, die bei jedem Aufruf die nächste Zeile in der Datei zurückgibt. Es ist erwähnenswert, dass __next__ bei Erreichen des Endes der Datei die integrierte StopIteration-Ausnahme auslöst, anstatt eine leere Zeichenfolge zurückzugeben.

Zum Beispiel:

Beachten Sie, dass der Ausdruck hier end='' verwendet, um immer ein n hinzuzufügen, da die Zeilenzeichenfolge bereits eines hat (falls vorhanden). Wenn dies nicht der Fall ist, wird unsere Ausgabe durch zwei Zeilen getrennt.

Es gibt drei Vorteile, Dateien auf diese Weise zu lesen:

1 Methode

2. Schnelle Laufgeschwindigkeit

3. Es ist auch die beste Methode im Hinblick auf die Speichernutzung

Die ursprüngliche Methode mit dem gleichen Effekt besteht darin, eine for-Schleife zu verwenden Rufen Sie die Readlines-Methode der Datei auf. Sie dient dazu, die Datei in den Speicher zu laden und in eine Liste von Zeilenzeichenfolgen umzuwandeln.

Obwohl die beiden Effekte gleich sind, lädt letzteres die Datei auf einmal in den Speicher. Wenn die Datei zu groß ist, reicht der Speicherplatz des Computers nicht aus es kann sein, dass es nicht einmal funktioniert. Die frühere Iteratorversion ist gegen dieses Problem immun. (Python3 macht dies etwas weniger offensichtlich und weniger systemabhängig, indem es i/o umschreibt, um Unicode-Text zu unterstützen)

Natürlich kann es auch mit einer While-Schleife implementiert werden, aber relativ gesehen ist while immer noch besser als für langsam.

Manuelle Iteration: iter und next

Um die manuelle Iteration von Code zu unterstützen, bietet Python3 auch eine integrierte Funktion next, die automatisch die __next__-Methode eines Objekts verwendet. Bei einem iterierbaren Objekt z entspricht der Aufruf von next(z) dem Aufruf von z.__next__(), ersteres ist jedoch viel einfacher. Beispiel:

Aus technischer Sicht wird beim Start der for-Schleife die integrierte Iter-Funktion durchgegeben Erhält einen Iterator von einem iterierbaren Objekt. Das zurückgegebene Objekt enthält die erforderliche nächste Methode.

Listen und viele andere integrierte Objekte sind selbst keine Iteratoren, da sie das mehrfache Öffnen von Iteratoren unterstützen. Für ein solches Objekt müssen wir iter aufrufen, um die Iteration zu starten:

Technisch gesehen ruft die for-Schleife das interne Äquivalent von I.__next__ anstelle des hier verwendeten next (I) auf.

Jetzt zeigen wir die Äquivalenz zwischen automatischer und manueller Iteration:

Über try Die Anweisung führt eine Aktion aus und erfasst sie Ausnahmen, die während der Operation auftreten, werde ich in einem späteren Artikel ausführlich erläutern.

Das obige ist der detaillierte Inhalt vonLeicht verwirrende Konzepte in Python-Iteratoren und -Generatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn