Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in Python-Iteratoren und -Generatoren

Detaillierte Einführung in Python-Iteratoren und -Generatoren

高洛峰
高洛峰Original
2017-03-22 10:00:101220Durchsuche

1. Was ist ein Iterator?

Lassen Sie uns zunächst darüber sprechen, was Iteration bedeutet, eine Sache mehrmals zu wiederholen, beispielsweise eine for-Schleife. Die

for-Schleife kann über alle Objekte iterieren, die über Iter-Methoden verfügen. Was ist also die Iter-Methode?

Ob ein Objekt iterierbar ist oder nicht, hängt davon ab, ob das Objekt über eine Iter-Methode verfügt. Dieser Iterator muss über eine next-Methode verfügen Wenn die Methode dieses Iterators aufgerufen wird, gibt der Iterator seinen nächsten Wert zurück. Wenn im Iterator kein zurückzugebender Wert vorhanden ist, wird eine Ausnahme namens StopIteration ausgelöst, um die Iteration zu stoppen.

Ein weiteres sehr wichtiges Merkmal von Iteratoren ist, dass sie irreversibel sind und sich nur vorwärts und nicht rückwärts bewegen können.

So funktioniert die for-Schleife. Wenn die for-Schleife ein Objekt durchläuft, ruft sie die Iter-Methode des Objekts auf, um den Iterator abzurufen, und ruft dann die nächste Methode des Iterators auf, um den Iterator abzurufen . Jeder Wert enthalten.

2. Was ist der Unterschied zwischen Listen und Iteratoren? Wie kann ich einen einfachen Iterator implementieren?

Die Funktionsweise von Iteratoren besteht darin, einen Wert zu berechnen und bei der Verwendung einen Wert abzurufen, während eine Liste alle Werte auf einmal abruft. Wenn es viele Werte gibt, nimmt sie viel Speicher in Anspruch.

Wenn Sie selbst ein Objekt erstellen, wie machen Sie Ihr Objekt iterierbar?

Klasse test_class:

def init(self,start_num,stop_num):

self.start_num = start_num

self. stop_num = stop_num

def next(self):

if self.start_num < self.stop_num:

self.start_num += 1

🎜> print

test_obj.next ()

& gt; & gt; & gt; 1

print test_obj.next ()

> >>2

print test_obj.next()

>>>3

3. Was ist ein

Generator?

?

Nach meinem persönlichen Verständnis ist der Generator ein spezielles iterierbares Objekt. Es unterscheidet sich von anderen iterierbaren Objekten. Das heißt, dass andere iterierbare Objekte die Iterator-Methode aufrufen und dann ausführen müssen Die nächste Methode verwendet das Iteratorobjekt, um den Wert im Iterator zu erhalten. Der Generator kann jedoch direkt iteriert werden, ohne die Iter-Methode auszuführen.

Es gibt zwei Ausdrucksformen von Generatoren in

Python

:

Funktionsgenerator im

-Stil: Das heißt, im wahrsten Sinne des Wortes in einer regulären Funktion Generator, der Rückgabewert der Anweisung verwendet nicht mehr return, um jedes Mal ein Ergebnis zurückzugeben, sondern das Schlüsselwort yield. Es kann nicht mehrere Rückgaben in einer Funktion geben, aber es können mehrere Renditen vorhanden sein, die jeweils in der Funktion zurückgegeben werden Ein Ergebnis. Jedes Mal, wenn eine Ausbeute ausgeführt wird, wird der Ausführungsstatus

auf „suspendiert“ gesetzt, was als „suspendiert“ verstanden werden kann. Wenn Sie diese Funktion das nächste Mal aufrufen, wird sie mit der letzten Unterbrechung fortgesetzt Position nach unten ausführen.

Das Folgende ist ein Beispiel für einen Funktionsgenerator: Das folgende Beispiel verifiziert die beiden Merkmale von yield. Das erste ist, dass eine Funktion mehrere Werte liefern kann und es mehrere Erträge gibt. Ein weiterer Vorteil ist die Aufhängung funktionsfähiger Generatoren.

def func1(): yield 1 print „Die erste Yield-Ausführung ist abgeschlossen~“

yield 2

print „Die Ausführung der zweiten Ausbeute ist abgeschlossen~“

yield 3

print „Die Ausführung der dritten Ausbeute ist abgeschlossen~“

for i in func1():

print i

>>>1

Die erste Ertragsausführung ist abgeschlossen~

2

Der zweite Ertrag Die Ausführung ist abgeschlossen~

3

Die dritte Ertragsausführung ist abgeschlossen~

Generator

Ausdruck

: Verwenden Sie eine Methode ähnlich dem Listenverständnis, geben Sie jedoch die zurück Objekt Es ist keine Liste mehr, sondern ein Objekt (Generator), das bei Bedarf Ergebnisse generieren kann.

Beispiel 1:

für i in (i für i im

Bereich

(10000)):

     print i

(i für i in range(5)) Dies ist der Generatorausdruck.

(i for i in range(10000)) = def test(): for i in range(10000):yield i

Diese beiden Schreibmethoden haben den gleichen Effekt, nur geschrieben Es gibt verschiedene Möglichkeiten, eines ist ein Generatorausdruck und das andere ist ein Funktionsgenerator.

Haben Sie jemals gedacht, dass diese Art von Generatorausdruck einem Listenverständnis sehr ähnlich sieht? Der Unterschied besteht darin, dass das Listenverständnis eckige Klammern verwendet, während der Generatorausdruck ()-Klammern verwendet.

Das ist es, die Syntax zwischen ihnen ist tatsächlich nur ein Klammerunterschied, allerdings sparen Generatorausdrücke mehr Speicherplatz.

Über Generatoren, das ist so ziemlich alles:

Die Definitionsmethode von Generatoren ist genau die gleiche wie die von gewöhnlichen Funktionen. Der Unterschied besteht darin, dass Generatoren den Wert A zurückgeben , verwendet die Funktion return, um einen Wert zurückzugeben.

In Python implementiert der Generator automatisch das Iterationsprotokoll und gibt eine StopIteration-Ausnahme zurück, wenn kein Wert zurückzugeben ist.

Generatoren verwenden die yield-Anweisung, um einen Wert zurückzugeben. Die yield-Anweisung unterbricht den Status der Generatorfunktion und behält genügend Informationen bei, um die Ausführung später an der Stelle fortzusetzen, an der sie aufgehört hat.

Das folgende Beispiel ist ein Vergleich der Ausführungseffizienz von Listenverständnissen und Generatorausdrücken. Interessierte Freunde können es auf ihren eigenen Computern ausprobieren.

#Listenanalyse

sum([i for i in range(100000000)])#Der Speicherverbrauch ist groß und die Maschine bleibt leicht hängen

#Generator Ausdruck

sum(i for i in range(100000000))# nimmt fast keinen Speicher ein

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung 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