Rendite in Python Tutorial: Generator & Beispiel Rendite vs. Rendite
Was ist Python Ausbeute?
Das Schlüsselwort yield in Python funktioniert wie ein Return mit dem einzigen
Der Unterschied besteht darin, dass anstelle der Rückgabe eines Werts ein Generatorobjekt an den Anrufer zurückgegeben wird.
Wenn eine Funktion aufgerufen wird und der Ausführungsthread ein „yield“-Schlüsselwort in der Funktion findet, wird die Funktionsausführung an dieser Zeile selbst angehalten und gibt ein Generatorobjekt an den Anrufer zurück.
Syntax
yield expression
Beschreibung
Python yield gibt ein Generatorobjekt zurück. Generators sind spezielle Funktionen, die iteriert werden müssen, um die Werte zu erhalten.
Das Schlüsselwort yield konvertiert den angegebenen Ausdruck in eine Generatorfunktion, die ein Generatorobjekt zurückgibt. Um die Werte des Objekts abzurufen, muss es iteriert werden, um die an yield übergebenen Werte zu lesen.
Beispiel: Ertragsmethode
Hier ist ein einfaches Beispiel für den Ertrag. Die Funktion testyield() hat ein yield-Schlüsselwort mit der Zeichenfolge „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)
Ausgang:
<generator object testyield at 0x00000028265EB9A8>
Die Ausgabe ist ein Generatorobjekt, das den von uns angegebenen Wert hat.
Aber wir verstehen nicht die Botschaft, die wir vermitteln müssen, um in der Ausgabe nachzugeben!
Um die an yield gesendete Nachricht auszudrucken, 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)
Ausgang:
Welcome to Guru99 Python Tutorials
Was sind Generators in Python?
Generators sind Funktionen, die ein iterierbares Generatorobjekt zurückgeben. Die Werte aus dem Generatorobjekt werden einzeln abgerufen, anstatt die gesamte Liste zusammen. Um die tatsächlichen Werte zu erhalten, können Sie daher eine For-Schleife mit der Methode next() oder list() verwenden.
Die richtigen Generator Funktion
Sie können Generatoren mithilfe der Generatorfunktion und des Generatorausdrucks erstellen.
Eine Generatorfunktion ist wie eine normale Funktion, statt eines Rückgabewerts hat sie ein Yield-Schlüsselwort.
Um eine Generatorfunktion zu erstellen, müssen Sie ein Yield-Schlüsselwort hinzufügen. Die folgenden Beispiele zeigen, wie eine Generatorfunktion erstellt wird.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
Ausgang:
H E L L O
Unterschied zwischen Normalfunktion und/s Generator Funktion.
Lassen Sie uns verstehen, wie sich eine Generatorfunktion von einer normalen Funktion unterscheidet.
Es gibt zwei Funktionen: normal_test() und generator_test().
Beide Funktionen sollen den String „Hallo Welt“ 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
Ausgang:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Die Ausgabe zeigt, dass beim Aufruf der normalen Funktion normal_test() die Zeichenfolge „Hello World“ zurückgegeben wird. Für eine Generatorfunktion mit dem Schlüsselwort „yield“ wird die Zeichenfolge zurückgegeben. und nicht die Zeichenfolge.
Dies ist der Hauptunterschied zwischen einer Generatorfunktion und einer normalen Funktion. Um nun den Wert vom Generatorobjekt zu erhalten, müssen wir entweder das Objekt in der For-Schleife verwenden oder die Methode next() oder list() nutzen.
print(next(generator_test())) # will output Hello World
Ein weiterer Unterschied zwischen der normalen Funktion und der Generatorfunktion besteht darin, dass beim Aufruf einer normalen Funktion die Ausführung gestartet und gestoppt wird, wenn sie Rückkehr und der Wert wird an den Aufrufer zurückgegeben. Wenn also die Ausführung beginnt, können Sie die normale Funktion zwischendurch nicht stoppen und sie stoppt erst, wenn sie auf das Schlüsselwort return stößt.
Aber im Fall der Generatorfunktion stoppt sie die Ausführung, sobald sie beginnt und das erste Ergebnis erhält, und gibt das Generatorobjekt zurück. Sie können das Generatorobjekt verwenden, um die Werte abzurufen und es je nach Bedarf anzuhalten und fortzusetzen.
Wie lese ich die Werte aus dem Generator?
Sie können die Werte aus einem Generatorobjekt mithilfe einer list()-, for-Schleife und der next()-Methode lesen.
Verwendung: list()
Eine Liste ist ein iterierbares Objekt, dessen Elemente in Klammern stehen. Die Anwendung von list() auf 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))
Ausgang:
[0, 2, 4, 6, 8]
Verwendung: for-in
Im Beispiel gibt es eine Funktion namens even_numbers(), die Ihnen alle geraden Zahlen für die definierten n liefert. Der Aufruf der Funktion even_numbers() gibt ein Generatorobjekt zurück, das in der For-Schleife verwendet wird.
Ejemplo:
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)
Ausgang:
0 2 4 6 8
Verwendung von next()
Die next()-Methode liefert 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 die Liste keine weiteren Elemente enthält.
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))
Ausgang:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
GeneratorEs handelt sich um eine einmalige Nutzung
Im Falle von Generatoren können diese nur einmal verwendet werden. Wenn Sie versuchen, sie erneut zu verwenden, sind sie leer.
Beispielsweise:
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))
Ausgang:
0 2 4 6 8 Calling the generator again: []
Falls Sie möchten, dass die Ausgabe erneut verwendet wird, müssen Sie den Funktionsaufruf erneut durchführen.
Ejemplo: Generators und Rendite für die Fibonacci-Reihe
Das folgende Beispiel zeigt die Verwendung von Generatoren und Yield in Python. Das Beispiel generiert die Fibonacci-Folge.
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)
Ausgang:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Beispiel: Funktion mit Yield aufrufen
In diesem Beispiel erfahren Sie, wie Sie eine Funktion mit yield aufrufen.
Das folgende Beispiel hat eine Funktion namens test(), die das Quadrat der angegebenen Zahl zurückgibt. Es gibt eine weitere Funktion namens getSquare(), die test() mit dem Schlüsselwort yield 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)
Ausgang:
0 1 4 9 16 25 36 49 64 81
Wann wird Yield anstelle von Return verwendet in Python
Python3 Ertrag Das Schlüsselwort gibt einen Generator an den Anrufer zurück und die Ausführung des Codes beginnt erst, wenn der Generator iteriert wird.
A 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 anstelle von return, wenn die Datengröße groß ist
- Yield ist die beste Wahl, wenn die Ausführung großer Datenmengen schneller sein soll
- Verwenden Sie yield, wenn Sie eine große Menge von Werten an die aufrufende Funktion zurückgeben möchten
- Yield ist eine effiziente Methode zur Erzeugung großer oder unendlich großer Datenmengen.
Rendite vs. Rendite
Hier sind die Unterschiede zwischen Rendite und Rendite
Ausbeute | Return |
---|---|
Yield gibt dem Anrufer ein Generatorobjekt zurück und die Ausführung des Codes beginnt erst, wenn der Generator iteriert wird. | Eine Rückgabe in einer 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 Schlüsselwort „yield“ stößt, wird die Ausführung der Funktion gestoppt. Sie gibt das Generatorobjekt an den Aufrufer zurück. Die Ausführung der Funktion wird erst gestartet, wenn das Generatorobjekt ausgeführt wird. | Wenn die Funktion aufgerufen wird, beginnt die Ausführung und der Wert wird an den Aufrufer zurückgegeben, sofern ein Schlüsselwort return vorhanden ist. Der Return innerhalb der Funktion markiert das Ende der Funktionsausführung. |
Ertragsausdruck | Rückgabeausdruck |
Bei Verwendung des Schlüsselworts yield wird kein Speicher verwendet. | Der Speicher wird für den zurückgegebenen Wert reserviert. |
Sehr nützlich, wenn Sie große Datenmengen verarbeiten müssen, da der Speicher nicht genutzt wird. | Praktisch für sehr kleine Datenmengen. |
Die Leistung ist besser, wenn das Schlüsselwort yield für große Datenmengen verwendet wird. | Bei großen Datenmengen wird viel Speicher beansprucht, was die Leistung beeinträchtigt. |
Bei großen Datenmengen ist die Ausführungszeit kürzer. | Die benötigte Ausführungszeit ist länger, da zusätzliche Verarbeitung erfolgt. Wenn Ihre Datengröße groß ist, funktioniert dies auch bei kleinen Datengrößen. |
Zusammenfassung
- Das Schlüsselwort „yield“ in Python funktioniert wie „return“, mit dem einzigen Unterschied, dass es statt eines Werts eine Generatorfunktion an den Anrufer zurückgibt.
- Ein Generator ist ein spezieller Iteratortyp, der nach seiner Verwendung nicht mehr verfügbar ist. Die Werte werden nicht im Speicher gespeichert und sind nur beim Aufruf verfügbar.
- Die Werte aus dem Generator können mit den Methoden for-in, list() und next() gelesen werden.
- Der Hauptunterschied zwischen „yield“ und „return“ besteht darin, dass „yield“ eine Generatorfunktion an den Anrufer zurückgibt und „return“ dem Anrufer einen einzelnen Wert gibt.
- Yield speichert keinen der Werte im Speicher und hat den Vorteil, dass es hilfreich ist, wenn die Datenmenge groß ist, da keiner der Werte im Speicher gespeichert wird.
- Die Leistung ist besser, wenn das Schlüsselwort yield im Vergleich zur Rückgabe großer Datenmengen verwendet wird.