Yield in Python Tutorial:Generator &Yield vs. Return Beispiel
Was ist Python Yield?
Das yield-Schlüsselwort in Python funktioniert wie ein Return mit dem only
Der Unterschied besteht darin, dass anstelle eines Werts ein Generatorobjekt an den Aufrufer zurückgegeben wird.
Wenn eine Funktion aufgerufen wird und der Ausführungsthread ein yield-Schlüsselwort in der Funktion findet, stoppt die Funktionsausführung an dieser Zeile selbst und gibt ein Generatorobjekt an den Aufrufer zurück.
In diesem Python-Tutorial lernen Sie:
- Was ist Python Yield?
- Syntax
- Was sind Generatoren in Python?
- Unterschied zwischen Normalfunktion und Generatorfunktion.
- Wie liest man die Werte aus dem Generator aus?
- Generatoren sind einmalige Nutzung
- Beispiel:Generatoren und Ertrag für Fibonacci-Reihen
- Beispiel:Aufruffunktion mit Yield
- Wann Yield statt Return in Python verwendet werden sollte
- Rendite vs. Rendite
Syntax
yield expression
Beschreibung
Python yield gibt ein Generatorobjekt zurück. Generatoren sind spezielle Funktionen, die wiederholt werden müssen, um die Werte zu erhalten.
Das yield-Schlüsselwort wandelt den angegebenen Ausdruck in eine Generatorfunktion um, die ein Generatorobjekt zurückgibt. Um die Werte des Objekts zu erhalten, muss es iteriert werden, um die an den Ertrag gegebenen Werte zu lesen.
Beispiel:Ertragsmethode
Hier ist ein einfaches Ertragsbeispiel. Die Funktion testyield() hat ein yield-Schlüsselwort mit der Zeichenkette „Welcome to Guru99 Python Tutorials“. Wenn die Funktion aufgerufen wird, wird die Ausgabe gedruckt und gibt anstelle des tatsächlichen Werts ein Generatorobjekt zurück.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
Ausgabe:
<generator object testyield at 0x00000028265EB9A8>
Die angegebene Ausgabe ist ein Generatorobjekt, das den von uns angegebenen Wert für yield hat.
Aber wir bekommen nicht die Botschaft, die wir geben müssten, um die Ausgabe nachzugeben!
Um die an yield übergebene Nachricht zu drucken, muss das Generatorobjekt wie im folgenden Beispiel gezeigt iteriert werden:
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
Ausgabe
Welcome to Guru99 Python Tutorials
Was sind Generatoren in Python?
Generatoren sind Funktionen, die ein iterierbares Generatorobjekt zurückgeben. Die Werte aus dem Generator-Objekt werden einzeln statt der vollständigen Liste zusammen abgerufen. Um die tatsächlichen Werte zu erhalten, können Sie daher eine for-Schleife verwenden, indem Sie die Methode next() oder list() verwenden.
Generatorfunktion verwenden
Sie können Generatoren mit der Generatorfunktion und mit dem Generatorausdruck erstellen.
Eine Generatorfunktion ist wie eine normale Funktion, anstatt einen Rückgabewert zu haben, hat sie ein yield-Schlüsselwort.
Um eine Generatorfunktion zu erstellen, müssen Sie ein yield-Schlüsselwort hinzufügen. Das folgende Beispiel zeigt, wie Sie eine Generatorfunktion erstellen.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
Ausgabe:
H E L L O
Unterschied zwischen Normalfunktion und Generatorfunktion.
Lassen Sie uns verstehen, wie sich eine Generatorfunktion von einer normalen Funktion unterscheidet.
Es gibt 2 Funktionen normal_test() und generator_test().
Beide Funktionen sollen die Zeichenfolge „Hello World“ zurückgeben. Normal_test() verwendet return und generator_test() verwendet yield.
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
Ausgabe:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Die Ausgabe zeigt, dass beim Aufrufen der normalen Funktion normal_test() die Zeichenfolge „Hello World“ zurückgegeben wird. Für eine Generatorfunktion mit dem Schlüsselwort yield wird
Dies ist der Hauptunterschied zwischen einer Generatorfunktion und einer normalen Funktion. Um nun den Wert aus dem Generator-Objekt zu erhalten, müssen wir entweder das Objekt innerhalb der for-Schleife verwenden oder die next()-Methode verwenden oder list() verwenden.
print(next(generator_test())) # will output Hello World
Ein weiterer Unterschied, der zur normalen Funktion vs. Generatorfunktion hinzugefügt werden muss, besteht darin, dass beim Aufruf einer normalen Funktion die Ausführung beginnt und stoppt, wenn sie zurückkehrt und der Wert wird an den Aufrufer zurückgegeben. Wenn die Ausführung also beginnt, können Sie die normale Funktion nicht zwischendurch anhalten, und sie wird nur angehalten, wenn sie auf das Schlüsselwort return stößt.
Aber im Falle der Generatorfunktion, sobald die Ausführung beginnt, wenn sie die erste Ausbeute erhält, stoppt sie die Ausführung und gibt das Generatorobjekt zurück. Sie können das Generator-Objekt verwenden, um die Werte abzurufen und je nach Bedarf anzuhalten und fortzusetzen.
Wie lese ich die Werte aus dem Generator?
Sie können die Werte aus einem Generatorobjekt mit einer list()-, for-Schleife und mit der next()-Methode lesen.
Mit :list()
Eine Liste ist ein iterierbares Objekt, dessen Elemente in Klammern stehen. Die Verwendung von list() für ein Generatorobjekt gibt alle Werte aus, die der Generator enthält.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
Ausgabe:
[0, 2, 4, 6, 8]
Mit :for-in
In dem Beispiel gibt es eine definierte Funktion even_numbers(), die Ihnen alle geraden Zahlen für das definierte n liefert. Der Aufruf der Funktion even_numbers() gibt ein Generatorobjekt zurück, das innerhalb der for-Schleife verwendet wird.
Beispiel:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
Ausgabe:
0 2 4 6 8
Mit next()
Die Methode next() gibt Ihnen das nächste Element in der Liste, im Array oder im Objekt. Sobald die Liste leer ist und next() aufgerufen wird, wird ein Fehler mit dem Signal stopIteration zurückgegeben. Dieser Fehler von next() zeigt an, dass es keine weiteren Elemente in der Liste gibt.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
Ausgabe:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
Generatoren sind einmalige Nutzung
Bei Generatoren stehen diese nur einmal zur Verfügung. Wenn Sie versuchen, sie erneut zu verwenden, ist sie leer.
Zum Beispiel:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
Ausgabe:
0 2 4 6 8 Calling the generator again: []
Falls Sie möchten, dass die Ausgabe erneut verwendet wird, müssen Sie die Funktion erneut aufrufen.
Beispiel:Generatoren und Ertrag für Fibonacci-Reihen
Das folgende Beispiel zeigt die Verwendung von Generatoren und yield in Python. Das Beispiel generiert die Fibonacci-Reihe.
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
Ausgabe:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Beispiel:Aufruffunktion mit Yield
In diesem Beispiel wird gezeigt, wie man eine Funktion mit yield.
aufruftDas folgende Beispiel hat eine Funktion namens test(), die das Quadrat der gegebenen Zahl zurückgibt. Es gibt eine weitere Funktion namens getSquare(), die test() mit dem yield-Schlüsselwort verwendet. Die Ausgabe gibt den Quadratwert für den angegebenen Zahlenbereich an.
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
Ausgabe:
0 1 4 9 16 25 36 49 64 81
Wann Yield statt Return in Python verwendet werden sollte
Python3-Ertrag Schlüsselwort gibt einen Generator an den Aufrufer zurück und die Ausführung des Codes beginnt nur, wenn der Generator iteriert wird.
Eine Rückkehr in einer Funktion ist das Ende der Funktionsausführung, und ein einzelner Wert wird an den Aufrufer zurückgegeben.
Hier ist die Situation, in der Sie Yield anstelle von Return verwenden sollten
- Verwenden Sie yield statt return, wenn die Datengröße groß ist
- Yield ist die beste Wahl, wenn Ihre Ausführung bei großen Datensätzen schneller sein muss
- Verwenden Sie yield, wenn Sie eine große Menge von Werten an die aufrufende Funktion zurückgeben möchten
- Ertrag ist eine effiziente Methode, um große oder unendliche Datenmengen zu produzieren.
Rendite vs. Rendite
Hier sind die Unterschiede zwischen Yield und Return
Ertrag | Zurück |
---|---|
Yield gibt ein Generatorobjekt an den Aufrufer zurück und die Ausführung des Codes beginnt erst, wenn der Generator iteriert wird. | Eine Rückkehr in eine Funktion ist das Ende der Funktionsausführung und ein einzelner Wert wird an den Aufrufer zurückgegeben. |
Wenn die Funktion aufgerufen wird und auf das yield-Schlüsselwort trifft, stoppt die Ausführung der Funktion. Es gibt das Generatorobjekt an den Aufrufer zurück. Die Funktionsausführung beginnt erst, wenn das Generatorobjekt ausgeführt wird. | Wenn die Funktion aufgerufen wird, beginnt die Ausführung und der Wert wird an den Aufrufer zurückgegeben, wenn das Schlüsselwort return vorhanden ist. Die Rückkehr innerhalb der Funktion markiert das Ende der Funktionsausführung. |
Ertragsausdruck | Rückgabeausdruck |
Bei Verwendung des yield-Schlüsselworts wird kein Speicher verwendet. | Der Speicher wird für den zurückgegebenen Wert zugewiesen. |
Sehr nützlich, wenn Sie mit großen Datenmengen umgehen müssen, da der Speicher nicht verwendet wird. | Praktisch für sehr kleine Datenmengen. |
Die Leistung ist besser, wenn das yield-Schlüsselwort für große Datenmengen verwendet wird. | Viel Speicher wird verwendet, wenn die Datengröße sehr groß ist, was die Leistung beeinträchtigt. |
Die Ausführungszeit ist schneller im Falle einer Ausbeute für große Datenmengen. | Die verwendete Ausführungszeit ist länger, da eine zusätzliche Verarbeitung durchgeführt wird, falls Ihre Datengröße sehr groß ist, es für kleine Datengrößen gut funktioniert. |
Zusammenfassung:
- Das yield-Schlüsselwort in Python funktioniert wie eine Rückgabe, mit dem einzigen Unterschied, dass es statt der Rückgabe eines Werts eine Generatorfunktion an den Aufrufer zurückgibt.
- Ein Generator ist ein spezieller Iteratortyp, der nach seiner Verwendung nicht mehr verfügbar ist. Die Werte werden nicht gespeichert und sind nur auf Abruf verfügbar.
- Die Werte aus dem Generator können mit der Methode for-in, list() und next() gelesen werden.
- Der Hauptunterschied zwischen yield und return besteht darin, dass yield eine Generatorfunktion an den Aufrufer zurückgibt und return dem Aufrufer einen einzelnen Wert gibt.
- Yield speichert keinen der Werte im Speicher, und der Vorteil ist, dass es hilfreich ist, wenn die Datengröße groß ist, da keiner der Werte im Speicher gespeichert wird.
- Die Leistung ist besser, wenn das yield-Schlüsselwort im Vergleich dazu verwendet wird, um große Datenmengen zurückzugeben.
Python
- Anonyme Python/Lambda-Funktion
- Python-Generatoren
- Python-Schließungen
- Python-Dekorateure
- Python String strip() Funktion mit BEISPIEL
- Länge der Python-Zeichenfolge | len() Methode Beispiel
- Python-Lambda-Funktionen mit BEISPIELE
- Python-Funktion round() mit BEISPIELE
- Python map() Funktion mit BEISPIELE
- Python-Zähler in Sammlungen mit Beispiel