Ausbeute im Python-Tutorial: Generator & Beispiel Rendite gegen Rendite

Inhaltsverzeichnis:

Anonim

Was ist Python-Ertrag?

Das Yield-Schlüsselwort in Python funktioniert wie eine Rückgabe mit dem einzigen

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-Ertrag?
  • Syntax
  • Was sind Generatoren in Python?
  • Unterschied zwischen Normalfunktion v / s Generatorfunktion.
  • Wie lese ich die Werte vom Generator?
  • Generatoren sind einmalig einsetzbar
  • Beispiel: Generatoren und Ausbeute für die Fibonacci-Serie
  • Beispiel: Aufruffunktion mit Yield
  • Wann sollte Yield anstelle von Return in Python verwendet werden?
  • Rendite vs. Rendite

Syntax

yield expression

Beschreibung

Python Yield gibt ein Generatorobjekt zurück. Generatoren 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 zu erhalten, muss es iteriert werden, um die Werte zu lesen, die für die Ausbeute angegeben wurden.

Beispiel: Ertragsmethode

Hier ist ein einfaches Beispiel für die Ausbeute. 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 es wird ein Generatorobjekt anstelle des tatsächlichen Werts angegeben.

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)

Ausgabe:

Die angegebene Ausgabe ist ein Generatorobjekt, das den Wert hat, den wir angegeben haben, um zu ergeben.

Aber wir bekommen nicht die Botschaft, die wir geben müssen, um eine Ausgabe zu erzielen!

Um die zu ergebende 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 Generatorobjekt werden einzeln anstelle der vollständigen Liste abgerufen. Um die tatsächlichen Werte zu erhalten, können Sie eine for-Schleife mit der Methode next () oder list () verwenden.

Generatorfunktion verwenden

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

HELLO

Unterschied zwischen Normalfunktion v / s 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. Der normal_test () verwendet return und generator_test () verwendetield.

# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function

Ausgabe:

Hello World

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 und nicht die Zeichenfolge zurückgegeben.

Dies ist der Hauptunterschied zwischen einer Generatorfunktion und einer normalen Funktion. Um den Wert vom Generatorobjekt zu erhalten, müssen wir entweder das Objekt in der for-Schleife verwenden oder die next () -Methode verwenden oder list () verwenden.

print(next(generator_test())) # will output Hello World

Ein weiterer Unterschied zur normalen Funktion v / s Generatorfunktion hinzuzufügen ist , dass , wenn Sie rufen eine normale Funktion der Ausführung beginnen und aufhören , wenn es kommt zurückkehren und der Wert wird an den Aufrufer zurückgegeben. Wenn die Ausführung beginnt, können Sie die normale Funktion dazwischen nicht stoppen und sie wird nur gestoppt, wenn das Schlüsselwort return auftritt.

Im Falle einer Generatorfunktion stoppt die Ausführung, sobald sie die erste Ausbeute erhält, die Ausführung und gibt das Generatorobjekt zurück. Sie können das Generatorobjekt verwenden, um die Werte abzurufen und gemäß Ihren Anforderungen anzuhalten und fortzusetzen.

Wie lese ich die Werte vom Generator?

Sie können die Werte von einem Generatorobjekt mit list (), for-loop und next () lesen.

Verwenden von: list ()

Eine Liste ist ein iterierbares Objekt, dessen Elemente in Klammern stehen. Wenn Sie list () für ein Generatorobjekt verwenden, werden alle Werte angegeben, die der Generator enthält.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))

Ausgabe:

[0, 2, 4, 6, 8]

Verwenden von: for-in

Im Beispiel gibt es eine Funktion, die gerade_numbers () definiert ist und Ihnen alle geraden Zahlen für das definierte n gibt. Der Aufruf der Funktion Even_numbers () gibt ein Generatorobjekt zurück, das in der for-Schleife verwendet wird.

Beispiel:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)

Ausgabe:

02468

Verwenden von next ()

Mit der next () -Methode erhalten Sie 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 stopIteration-Signal 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 xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))

Ausgabe:

02468Traceback (most recent call last):File "main.py", line 11, in print(next(num))StopIteration

Generatoren sind einmalig einsetzbar

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 xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))

Ausgabe:

02468Calling the generator again: []

Wenn Sie möchten, dass die Ausgabe erneut verwendet wird, müssen Sie den Aufruf ausführen, um wieder zu funktionieren.

Beispiel: Generatoren und Ausbeute für die Fibonacci-Serie

Das folgende Beispiel zeigt, wie Generatoren und Erträge in Python verwendet werden. Das Beispiel generiert die Fibonacci-Serie.

def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)

Ausgabe:

0112358

Beispiel: Aufruffunktion mit Yield

In diesem Beispiel wird gezeigt, wie eine Funktion mit Yield aufgerufen wird.

Das folgende Beispiel hat eine Funktion namens test (), die das Quadrat der angegebenen Zahl zurückgibt. Es gibt eine andere Funktion namens getSquare (), die test () mit dem Schlüsselwort yield verwendet. Die Ausgabe gibt den quadratischen Wert für den angegebenen Nummernkreis an.

def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)

Ausgabe:

0149162536496481

Wann sollte Yield anstelle von Return in Python verwendet werden?

Das Schlüsselwort Python3 Yield gibt einen Generator an den Aufrufer 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.

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
  • Der Ertrag ist die beste Wahl, wenn Ihre Ausführung bei großen Datenmengen schneller sein soll
  • Verwenden Sie Yield, wenn Sie einen großen Satz von Werten an die aufrufende Funktion zurückgeben möchten
  • Der Ertrag ist eine effiziente Methode zur Erzeugung großer oder unendlicher Daten.

Rendite vs. Rendite

Hier sind die Unterschiede zwischen Rendite und Rendite

Ausbeute Rückkehr
Yield gibt ein Generatorobjekt an den Aufrufer 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 trifft, wird die Funktionsausführung gestoppt. Das Generatorobjekt wird an den Aufrufer zurückgegeben. Die Funktionsausführung startet 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ückgabe innerhalb der Funktion markiert das Ende der Funktionsausführung.
Ertragsausdruck Ausdruck zurückgeben
Bei Verwendung des Schlüsselworts yield 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 Datengrößen.
Die Leistung ist besser, wenn das Schlüsselwortield für große Datenmengen verwendet wird. Wenn die Datengröße sehr groß ist und die Leistung beeinträchtigt, wird viel Speicher verwendet.
Die Ausführungszeit ist bei Ertrag bei großen Datenmengen schneller. Die verwendete Ausführungszeit ist länger, da zusätzliche Verarbeitung durchgeführt wird, falls Ihre Datengröße sehr groß ist, funktioniert sie für kleine Datengrößen einwandfrei.

Zusammenfassung:

  • Das Yield-Schlüsselwort in Python funktioniert wie eine Rückgabe, mit dem einzigen Unterschied, dass anstelle einer Rückgabe eines Werts dem Aufrufer eine Generatorfunktion zurückgegeben wird.
  • Ein Generator ist ein spezieller Iteratortyp, der nach seiner Verwendung nicht mehr verfügbar ist. Die Werte werden nicht gespeichert und sind nur beim Aufruf verfügbar.
  • Die Werte vom 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 Aufrufer zurückgibt und Return dem Anrufer 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 ist.
  • Die Leistung ist besser, wenn das Ertragsschlüsselwort im Vergleich zur Rückgabe für große Datenmengen verwendet wird.