Einführung in Python-Generatoren

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.

Grundlagen

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.

Python-Iteratoren

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.

Iteration über ein Wörterbuch

d = 'x': 10, 'y': 20, 'z': 30 für k, v in d.items (): print k, v #result # y 20 # x 10 # z 30 

Iteration über Zeilen in einer CSV-Datei

Importieren Sie csv mit open ('file.csv', newline = ") als File: reader = csv.reader (File) für die Zeile in der Zeile" reader: yield "

Über einen String iterieren

my_string = 'Generators' für string in my_string: print (string) #result # G # e # n # e # r # a # t # o # r # s

Vorteile der Verwendung von Generatoren

Lassen Sie uns einige der Vorteile der Verwendung von Generatoren gegenüber Iteratoren diskutieren:

Einfach zu implementieren

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.

Weniger Speicherverbrauch

Generatoren helfen dabei, den Speicherverbrauch zu minimieren, insbesondere bei großen Datensätzen, da ein Generator jeweils nur ein Element zurückgibt.

Bessere Leistung und Optimierung

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.

So erstellen Sie einen Generator in Python

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)) 

Wie funktionieren Python-Generatoren?

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, in  StopIterationNormal-Funktion 

Beispiel 2

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.

Fazit

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.