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 Verwendung von 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.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: