Python-Generator-Klasse

Ammar Ali 21 Juni 2023
  1. Python-Iteratoren
  2. Python-Generator-Klasse
Python-Generator-Klasse

In diesem Tutorial wird die Verwendung der yield-Anweisung und der next()-Funktion zum Erstellen einer Generatorklasse in Python erläutert.

Um Generatoren zu verstehen, müssen wir zuerst die unten besprochenen Iteratoren verstehen.

Python-Iteratoren

Iteratoren sind Objekte, die verwendet werden, um nacheinander auf Elemente in einem Container zuzugreifen. Wir können die for-Anweisung verwenden, um Containerobjekte zu durchlaufen, um die Werte einzeln zu erhalten.

Ein Beispielcode ist unten gezeigt.

for element in [5, 6, 7]:
    print(element)

Im obigen Python-Code durchlaufen wir die Liste der Elemente und drucken sie einzeln aus. Lassen Sie uns verstehen, was hinter den Kulissen passiert.

Die for-Anweisung ruft die iter()-Funktion für das angegebene Containerobjekt auf, und die Funktion enthält eine Methode __next__(), die nacheinander auf jedes Element des angegebenen Containerobjekts zugreift.

Die Schleife wird beendet, wenn die Funktion __next__() eine Ausnahme StopIteration auslöst, und die Ausnahme wird nur ausgelöst, wenn keine Elemente mehr im angegebenen Containerobjekt vorhanden sind.

Python bietet auch die eingebaute Funktion next(), mit der die Funktion __next__() aufgerufen werden kann. Um die Funktion next() auf ein Containerobjekt anzuwenden, müssen wir ein Objekt mit der Funktion iter() erstellen.

Lassen Sie uns zum Beispiel eine Liste mit Zahlen verwenden und die Funktion next() aufrufen, um jedes Element der Liste einzeln abzurufen. Siehe den Code und die Ausgabe unten.

My_list = [5, 6, 7]
iter_object = iter(My_list)
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))

Ausgang:

5
6
7
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-10-aa02bcda701b> in <module>
      4 print(next(iter_object))
      5 print(next(iter_object))
----> 6 print(next(iter_object))

StopIteration:

Im obigen Code haben wir die Funktion next() viermal aufgerufen und die drei Elemente im angegebenen Listenobjekt einzeln zurückgegeben. Es hat beim vierten Aufruf die Ausnahme StopIteration zurückgegeben, weil keine Elemente mehr im Listenobjekt vorhanden waren.

Wir können die Funktion next() auch mit einer Schleife aufrufen.

Mit der Anweisung try-except können wir den Fehler vermeiden und den Namen der Ausnahme verwenden, um die Schleife zu beenden. Lassen Sie uns zum Beispiel den obigen Code mit einer Schleife und einer try-except-Anweisung wiederholen.

Siehe den Code und die Ausgabe unten.

My_list = [5, 6, 7]
iter_object = iter(My_list)

for i in range(len(My_list)):
    try:
        print(next(iter_object))
    except StopIteration:
        break

Ausgang:

5
6
7

Im obigen Code haben wir den Namen der Ausnahme, StopIteration, verwendet, um die Schleife zu unterbrechen. Der obige Iterator gibt Werte einzeln in einer Vorwärtssequenz zurück, aber wir können auch unseren eigenen Iterator definieren, der Werte gemäß unseren Anforderungen zurückgibt.

Wir müssen drei Funktionen definieren, __init__(), __iter__() und __next__(), um einer Klasse Iteratorverhalten hinzuzufügen. Lassen Sie uns zum Beispiel eine Klasse erstellen, die die Fibonacci-Zahlen zurückgibt.

Siehe Code unten

class Fibexample:
    def __init__(self):
        self.x, self.y = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        r_value = self.x
        self.x, self.y = self.y, self.x + self.y
        return r_value


fib = Fibexample()
for i in range(7):
    print(next(fib))

Ausgang:

0
1
1
2
3
5
8

Die obige Klasse gibt eine Zahl aus der Fibonacci-Reihe zurück, wenn die Funktion next() aufgerufen wird. Im obigen Code haben wir die Funktion next() sieben Mal aufgerufen und die ersten sieben Zahlen der Fibonacci-Reihe zurückgegeben.

Python-Generator-Klasse

In Python werden Generatoren verwendet, um Iteratoren zu erstellen. Sie sind die gleichen wie reguläre Funktionen; Der einzige Unterschied ist die Verwendung der yield-Anweisung anstelle der return-Anweisung.

Die Anweisung yield() ruft die Funktion next() auf, die ein Iteratorobjekt zurückgibt. Lassen Sie uns beispielsweise eine Generatorfunktion erstellen, die dieselbe Fibonacci-Reihe wie der obige Code zurückgibt.

Siehe den Code und die Ausgabe unten.

def fibexample(data_input):
    x, y = 0, 1
    for index in range(data_input):
        z = x
        x, y = y, x + y
        yield z


obj = fibexample(7)
for i in obj:
    print(i)

Ausgang:

0
1
1
2
3
5
8

Im obigen Code gibt die Funktion fibexample() die erforderlichen Zahlen der Fibonacci-Reihe in einem Iterator-Objekt zurück. Wir können eine Schleife verwenden, um das Objekt zu durchlaufen, um jeden Wert zu erhalten, der im Iteratorobjekt vorhanden ist.

Der Generator merkt sich die Datenwerte und die letzte Ausführung der next()-Funktion und macht dort weiter, wo er aufgehört hat, wenn die next()-Funktion erneut aufgerufen wird.

Das Ergebnis der obigen Funktion ist dasselbe wie das, was wir im Iteratoren-Beispiel erhalten haben, aber der obige Code ist relativ kurz im Vergleich zu dem Code, den wir im Iteratoren-Beispiel verwendet haben. Der Vorteil der Verwendung der Generatoren besteht darin, dass die Funktionen __iter__() und __next__() automatisch erstellt werden und die Generatoren auch die Ausnahme StopIteration behandeln.

Es ist also einfach, Iteratoren mit den Generatoren zu schreiben, denn das Erstellen von Iteratoren mit Generatoren ist wie das Schreiben einer einfachen Funktion mit der Anweisung yield.

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - Python Class