Heim  >  Artikel  >  Backend-Entwicklung  >  Python-detaillierte Erklärung der Generatoren

Python-detaillierte Erklärung der Generatoren

巴扎黑
巴扎黑Original
2017-06-23 15:10:061427Durchsuche

1. Was ist ein Generator?

Mit der Listengenerierung können wir direkt eine Liste erstellen. Aufgrund von Speicherbeschränkungen ist die Listenkapazität jedoch definitiv begrenzt. Darüber hinaus nimmt die Erstellung einer Liste mit 1 Million Elementen nicht nur viel Speicherplatz in Anspruch, sondern wenn wir nur auf die ersten paar Elemente zugreifen müssen, wird der von den meisten nachfolgenden Elementen belegte Platz verschwendet. Wenn also die Elemente der Liste nach einem bestimmten Algorithmus berechnet werden können, können wir dann die nachfolgenden Elemente während der Schleife kontinuierlich berechnen? Dadurch entfällt die Notwendigkeit, eine vollständige Liste zu erstellen, was viel Platz spart. In Python wird dieser Mechanismus der gleichzeitigen Schleife und Berechnung als Generator bezeichnet: Generator.

2. Erstellen Sie eine Generatormethode

Methode 1

Es gibt viele Möglichkeiten, einen Generator zu erstellen. Die erste Methode ist sehr einfach: Ändern Sie einfach das [ ] einer Listengenerierung in ( )

Der Unterschied zwischen der Erstellung von L und G besteht nur im äußersten [ ] und ( ), L ist eine Liste und G ist es ein Generator. Wir können jedes Element von L direkt ausdrucken, aber wie drucken wir jedes Element von G aus? Wenn Sie sie einzeln ausdrucken möchten, können Sie den nächsten Rückgabewert des Generators über die Funktion next() abrufen:


Laufendes Ergebnis:

Laufergebnis:

Der Generator speichert den Algorithmus, und jedes Mal, wenn next( G heißt), wird der Wert des nächsten Elements von G berechnet, bis das letzte Element berechnet ist. Wenn keine weiteren Elemente vorhanden sind, wird eine StopIteration-Ausnahme ausgelöst. Natürlich ist dieser kontinuierliche Aufruf von next() wirklich ungewöhnlich. Die richtige Methode ist die Verwendung einer for-Schleife, da der Generator auch ein iterierbares Objekt ist. Nachdem wir also einen Generator erstellt haben, rufen wir grundsätzlich nie next() auf, sondern iterieren ihn durch eine for-Schleife und müssen uns nicht um die StopIteration-Ausnahme kümmern.

Methode 2

Generator ist sehr leistungsstark. Wenn der Berechnungsalgorithmus relativ komplex ist und nicht über eine for-Schleife ähnlich der Listengenerierung implementiert werden kann, kann er auch über eine Funktion implementiert werden.

Zum Beispiel kann in der berühmten Fibonacci-Folge mit Ausnahme der ersten und zweiten Zahl jede beliebige Zahl durch Addition der ersten beiden Zahlen erhalten werden:

1 , 1, 2, 3, 5 , 8, 13, 21, 34, ...

Die Fibonacci-Folge kann nicht mit der Listengenerierung geschrieben werden, aber es ist einfach, sie mit einer Funktion auszudrucken:


Laufergebnis:

Wenn Sie genau hinsehen, können Sie erkennen, dass die Fib-Funktion tatsächlich definiert ist. Nachdem Sie die Berechnungsregeln der Fibonacci-Folge verstanden haben, können Sie kann mit dem ersten Element beginnen und alle nachfolgenden Elemente berechnen. Diese Logik ist tatsächlich dem Generator sehr ähnlich.

Mit anderen Worten, die obige Funktion ist nur einen Schritt vom Generator entfernt. Um die Fib-Funktion in einen Generator umzuwandeln, ändern Sie einfach print(b), um b zu erhalten:


Laufergebnisse:

Wenn wir im obigen Fib-Beispiel während der Schleife weiterhin yield aufrufen, wird diese weiterhin unterbrochen. Natürlich müssen Sie eine Bedingung festlegen, damit die Schleife die Schleife verlässt, andernfalls wird eine unendliche Zahl aufgelistet. Ebenso verwenden wir nach dem Ändern der Funktion in einen Generator grundsätzlich nie next(), um den nächsten Rückgabewert abzurufen, sondern verwenden direkt die for-Schleife zum Iterieren:

Laufergebnisse:

Aber als ich den Generator mit einer for-Schleife aufrief, stellte ich fest, dass ich den Rückgabewert der Return-Anweisung des Generators nicht erhalten konnte. Wenn Sie den Rückgabewert erhalten möchten, müssen Sie den StopIteration-Fehler erfassen. Der Rückgabewert ist im Wert von StopIteration enthalten:


Laufendes Ergebnis:

3.send

Beispiel: Bei der Ausführung von yield wird die gen-Funktion vorübergehend gespeichert und gibt den Wert von i zurück; temp empfängt das nächste Mal c.send("python"), den von gesendeten Wert send, c .next() entspricht c.send(None)

Nächste Funktion verwenden


Laufendes Ergebnis:

Methode __next__() verwenden


Laufendes Ergebnis:

Senden verwenden

Laufergebnisse:

4. Multitasking implementieren

Simulieren Multitasking-Implementierung Eins: Coroutine


Laufergebnis:

Zusammenfassung

Generator ist eine Funktion, die sich die Position im Funktionskörper bei ihrer letzten Rückkehr merkt. Der zweite (oder n-te) Aufruf einer Generatorfunktion springt in die Mitte der Funktion und lässt alle lokalen Variablen gegenüber dem vorherigen Aufruf unverändert.

Ein Generator „merkt“ sich nicht nur den Zustand seiner Daten; ein Generator „merkt“ sich auch seine Position innerhalb eines Flusskontrollkonstrukts (in der imperativen Programmierung ist dieses Konstrukt nicht nur ein Datenwert).

Funktionen des Generators:

1. Beim Iterieren zum nächsten Aufruf bleiben alle verwendeten Parameter vom ersten Mal an erhalten Das heißt, die Parameter aller Funktionsaufrufe bleiben beim ersten Aufruf erhalten und werden nicht neu erstellt.

5 Iterator

Iteration wird verwendet, um auf Sammlungselemente zuzugreifen. Eine Richtung. Ein Iterator ist ein Objekt, das sich die Position eines Durchlaufs merkt. Das Iteratorobjekt beginnt mit dem Zugriff vom ersten Element der Sammlung, bis auf alle Elemente zugegriffen wurde. Iteratoren können nur vorwärts und nicht rückwärts gehen.

1. Iterierbare Objekte

Die Datentypen, die direkt auf For-Schleifen einwirken, sind wie folgt:

Ein Typ sind Sammlungsdatentypen wie Liste, Tupel, Diktat, set, str usw.;

Eine Kategorie ist Generator, einschließlich Generator und Generatorfunktion mit Ertrag.

Diese Objekte, die direkt in for-Schleifen verwendet werden können, werden zusammenfassend als iterierbare Objekte bezeichnet: Iterable.

2. Bestimmen Sie, ob es iterierbar ist

Sie können isinstance() verwenden, um zu bestimmen, ob ein Objekt ein iterierbares Objekt ist:

Laufergebnis :
Der Generator kann nicht nur auf die for-Schleife einwirken, sondern kann auch kontinuierlich von der next()-Funktion aufgerufen werden und den nächsten Wert zurückgeben, bis schließlich Es wird ein StopIteration-Fehler ausgelöst, der darauf hinweist, dass die Rückkehr zum nächsten Wert nicht fortgesetzt werden kann.

3. Iterator

Ein Objekt, das von der Funktion next() aufgerufen werden kann und kontinuierlich den nächsten Wert zurückgibt, wird als Iterator bezeichnet: Iterator.

Laufergebnis:
4.iter()-Funktion

Generator They sind alle Iterator-Objekte, aber obwohl list, dict und str iterierbar sind, sind sie keine Iteratoren.

Um list, dict, str und andere Iterables in Iterator zu konvertieren, können Sie die Funktion iter() verwenden:

Laufergebnis:

Zusammenfassung

·Alle Objekte, die in for-Schleifen verwendet werden können, sind vom Typ Iterable;

·Alle Objekte, die in der Funktion next() verwendet werden können, sind vom Typ Iterator

·Sammlungsdatentypen wie list, dict, str usw. sind iterierbar, aber nicht Iterator, aber Sie können ein Iterator-Objekt über die Funktion iter() erhalten.

·Der Zweck besteht darin, den belegten Inhalt bei der Verwendung von Sammlungen zu reduzieren.

6. Abschluss

1. Funktionsreferenz


Laufergebnis:

Abbildung:

2. Was ist ein Verschluss


Laufergebnis:

3. Schauen Sie sich ein praktisches Beispiel für den Abschluss an:


Ergebnis ausführen:

In diesem Beispiel bilden die Funktionszeile und die Variablen a und b einen Abschluss. Beim Erstellen des Abschlusses geben wir die Werte dieser beiden Variablen über die Parameter a und b von line_conf an. Auf diese Weise bestimmen wir die endgültige Form der Funktion (y = x + 1 und y = 4x + 5). Wir müssen nur die Parameter a und b transformieren, um unterschiedliche gerade Ausdrucksfunktionen zu erhalten. Daraus können wir ersehen, dass Schließungen auch die Wirkung haben, die Wiederverwendbarkeit von Code zu verbessern.

Wenn es keinen Abschluss gibt, müssen wir jedes Mal, wenn wir eine Geradenfunktion erstellen, a, b, x angeben. Auf diese Weise müssen wir mehr Parameter übergeben, was auch die Portabilität des Codes verringert

Wenn Sie während des Lernprozesses auf Probleme stoßen oder Lernressourcen erhalten möchten, können Sie gerne der Lernaustauschgruppe beitreten
626062078, wir lernen gemeinsam Python!

Das obige ist der detaillierte Inhalt vonPython-detaillierte Erklärung der 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