Generatoren erleichtern das Erstellen von Iterationen in Python und schreiben im Gegenzug weniger Code. In diesem Lernprogramm werden Sie mit den Python-Generatoren, ihren Vorteilen und ihrer Funktionsweise vertraut gemacht.
Ein Generator ist eine Funktion, die ein Generatorobjekt zurückgibt, auf dem Sie das aufrufen können Nächster()
Methode, so dass für jeden Aufruf ein Wert oder der nächste Wert zurückgegeben wird. Eine normale Python-Funktion verwendet die Rückkehr
Schlüsselwort, um Werte zurückzugeben, aber Generatoren verwenden das Schlüsselwort Ausbeute
Werte zurückgeben. Dies bedeutet, dass jede Python-Funktion eine Ausbeute
Anweisung ist eine Generatorfunktion.
Das Ausbeute
Die Anweisung hält normalerweise die Funktion an und speichert den lokalen Status, damit er dort fortgesetzt werden kann, wo er aufgehört hat. Generatorfunktionen können eine oder mehrere haben Ausbeute
Aussagen.
Ein Generator ist auch ein Iterator, aber was ist ein Iterator? Bevor wir uns mit den Details von Generatoren beschäftigen, ist es meines Erachtens wichtig zu wissen, was Iteratoren sind, da sie einen wesentlichen Bestandteil dieser Diskussion bilden.
Ein Python-Iterator ist einfach eine Klasse, die einen __iter__ ()
Methode. Die meisten Python-Objekte sind iterierbar, das heißt, Sie können jedes Element in den Objekten durchlaufen. Beispiele für iterable in Python sind Strings, Listen, Tupel, Wörterbücher und Bereiche.
Betrachten wir das Beispiel unten, in dem wir eine Liste von Farben durchlaufen:
colors = ["rot", "blau", "gelb"] def my_funct (): für Farbe in Farben: Druckfarbe
Hinter den Kulissen der zum
Anweisung wird aufrufen iter ()
auf dem Listenobjekt. Die Funktion gibt dann ein Iteratorobjekt zurück, das die Methode definiert __Nächster__()
, Dadurch wird nacheinander auf jede Farbe zugegriffen. Wenn keine Farben mehr vorhanden sind, __Nächster__
wird ein erhöhen stopIteration
Ausnahme, die wiederum die zum
Schleife zu beenden.
d = 'x': 10, 'y': 20, 'z': 30 für k, v in d.items (): print k, v #result # y 20 # x 10 # z 30
Importieren Sie csv mit open ('file.csv', newline = ") als File: reader = csv.reader (File) für die Zeile in der Zeile" reader: yield "
my_string = 'Generators' für string in my_string: print (string) #result # G # e # n # e # r # a # t # o # r # s
Lassen Sie uns einige der Vorteile der Verwendung von Generatoren gegenüber Iteratoren diskutieren:
Um einen Iterator in Python zu erstellen, müssen Sie eine Klasse mit implementieren __iter__ ()
und __Nächster__()
Methoden sowie die Beseitigung eventueller Fehler, die a verursachen können stopIteration
Error.
class Reverse: "" "Iterator, um eine Sequenz rückwärts zu durchlaufen." "" def __init __ (self, data): self.data = data self.index = len (data) def __iter __ (self): return self def __next __ (self ): wenn self.index == 0: StopIteration erhöhen self.index = self.index - 1 return self.data [self.index]
Wie Sie oben sehen können, ist die Implementierung sehr langwierig. All diese Belastung wird automatisch von Generatoren übernommen.
Generatoren helfen dabei, den Speicherverbrauch zu minimieren, insbesondere bei großen Datensätzen, da ein Generator jeweils nur ein Element zurückgibt.
Generatoren sind faul in der Natur. Das bedeutet, dass sie nur dann Werte erzeugen, wenn dies erforderlich ist. Im Gegensatz zu einem normalen Iterator, bei dem alle Werte unabhängig von ihrer Verwendung generiert werden, generieren Generatoren nur die erforderlichen Werte. Dies führt wiederum dazu, dass Ihr Programm schneller arbeitet.
Das Erstellen eines Generators ist sehr einfach. Sie müssen lediglich eine normale Funktion schreiben, jedoch mit einer Ausbeute
Aussage statt einer Rückkehr
Anweisung, wie unten gezeigt.
def gen_function (): ergeben "Python"
Während ein Rückkehr
Anweisung beendet eine Funktion vollständig, Ausbeute
pausiert einfach die Funktion, bis sie erneut von der aufgerufen wird Nächster()
Methode.
Das folgende Programm verwendet zum Beispiel beide Ausbeute
und Nächster()
Aussagen.
def myGenerator (l): total = 1 für n in l: Gesamtsumme + + n newGenerator = myGenerator ([10,3]) print (next (newGenerator)) print (next (newGenerator))
Mal sehen, wie Generatoren funktionieren. Betrachten Sie das Beispiel unten.
# generator_example.py def myGenerator (l): total = 0 für n in l: total + = n ergeben total newGenerator = myGenerator ([10,20,30]) print (next (newGenerator)) print (next (newGenerator)) drucken (weiter (newGenerator))
In der Funktion oben definieren wir einen Generator mit dem Namen myGenerator
, das nimmt eine Liste l
als Argument. Wir definieren dann eine Variable gesamt
und weisen Sie ihm den Wert Null zu. Außerdem durchlaufen wir jedes Element in der Liste und fügen es anschließend der Gesamtvariablen hinzu.
Wir instanziieren dann newGenerator
und rufen Sie an Nächster()
Methode darauf. Dadurch wird der Code ausgeführt, bis der erste Wert von angezeigt wird gesamt
, was sein wird 0
in diesem Fall. Die Funktion behält dann den Wert der Gesamtvariablen bis zum nächsten Aufruf der Funktion bei. Im Gegensatz zu einem normalen Rückkehr
Anweisung, die alle Werte auf einmal zurückgibt, wird der Generator an der Stelle ansetzen, an der er aufgehört hat.
Nachfolgend sind die restlichen nachfolgenden Werte aufgeführt.
# generator_example.py def myGenerator (l): total = 0 für n in l: Gesamtmenge + + n newGenerator = myGenerator ([10,20,30]) print (next (newGenerator)) print (next (newGenerator)) print (next (newGenerator)) # result # 0 # 10 # 30
Wenn Sie versuchen, die Funktion aufzurufen, nachdem die Schleife abgeschlossen wurde, erhalten Sie eine StopIteration
Error.
EIN StopIteration
wird von der angehoben Nächster()
Methode, um zu signalisieren, dass keine weiteren Elemente vom Iterator produziert werden.
0 10 30 Traceback (letzter Anruf zuletzt): Datei "Python", Zeile 15, inStopIterationNormal-Funktion
In diesem Beispiel wird gezeigt, wie mehrere Ertragsanweisungen in einer Funktion verwendet werden.
# colors.py def colors (): Ertrag "Rot" Ertrag "Blau" Ertrag "Grün" next_color = colors () print (next (color)) print (next (color)) print (next (color)) # result # rot # blau # grün
Während eine normale Funktion alle Werte zurückgibt, wenn die Funktion aufgerufen wird, wartet ein Generator bis Nächster()
Methode wird erneut aufgerufen. Einmal Nächster()
aufgerufen wird, wird die Farbenfunktion an der Stelle fortgesetzt, an der sie aufgehört hat.
Generatoren sind speichereffizienter, insbesondere wenn mit sehr großen Listen oder großen Objekten gearbeitet wird. Dies liegt daran, dass Sie Erträge verwenden können, um mit kleineren Bits zu arbeiten, anstatt alle Daten gleichzeitig im Speicher zu haben.
Vergessen Sie nicht zu sehen, was wir für den Verkauf und das Studium auf dem Envato-Markt zur Verfügung haben, und zögern Sie nicht, Fragen zu stellen und wertvolles Feedback über den untenstehenden Feed zu geben.
Wenn Sie sich festgefahren fühlen, finden Sie im Kursabschnitt einen sehr guten Kurs zu Python-Generatoren.