Opbrengst in Python-zelfstudie: Generator & Opbrengst versus rendement Voorbeeld

Inhoudsopgave:

Anonim

Wat is Python-opbrengst?

Het trefwoord yield in python werkt als een return met de enige

Het verschil is dat in plaats van een waarde te retourneren, het een generatorobject teruggeeft aan de beller.

Wanneer een functie wordt aangeroepen en de thread van uitvoering vindt een yield-sleutelwoord in de functie, stopt de functie-uitvoering op die regel zelf en retourneert het een generatorobject terug naar de beller.

In deze Python-tutorial leer je:

  • Wat is Python-opbrengst?
  • Syntaxis
  • Wat zijn generatoren in Python?
  • Verschil tussen normale functie versus generatorfunctie.
  • Hoe lees ik de waarden van de generator?
  • Generatoren zijn eenmalig gebruik
  • Voorbeeld: generatoren en opbrengst voor Fibonacci-serie
  • Voorbeeld: functie aanroepen met opbrengst
  • Wanneer Yield in plaats van Return in Python moet worden gebruikt
  • Opbrengst versus rendement

Syntaxis

yield expression

Omschrijving

Python-opbrengst retourneert een generatorobject. Generatoren zijn speciale functies die moeten worden herhaald om de waarden te krijgen.

Het trefwoord yield converteert de gegeven uitdrukking naar een generatorfunctie die een generatorobject teruggeeft. Om de waarden van het object te krijgen, moet het worden herhaald om de waarden te lezen die aan de opbrengst zijn gegeven.

Voorbeeld: Opbrengstmethode

Hier is een eenvoudig voorbeeld van opbrengst. De functie testyield () heeft een trefwoord yield met de string "Welkom bij Guru99 Python Tutorials". Wanneer de functie wordt aangeroepen, wordt de uitvoer afgedrukt en geeft het een generatorobject in plaats van de werkelijke waarde.

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

Uitgang:

De gegeven uitvoer is een generatorobject, dat de waarde heeft die we hebben gegeven om op te leveren.

Maar we krijgen niet de boodschap die we moeten geven om aan de output toe te geven!

Om het bericht af te drukken dat is gegeven aan yield, moet het generatorobject herhalen zoals in het onderstaande voorbeeld wordt getoond:

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

Uitvoer

Welcome to Guru99 Python Tutorials

Wat zijn generatoren in Python?

Generatoren zijn functies die een itereerbaar generatorobject retourneren. De waarden van het generatorobject worden één voor één opgehaald in plaats van de volledige lijst samen. Om de werkelijke waarden te krijgen, kunt u een for-lus gebruiken met de methode next () of list ().

Generatorfunctie gebruiken

U kunt generatoren maken met behulp van de generatorfunctie en met behulp van generatoruitdrukking.

Een generatorfunctie is als een normale functie, in plaats van een retourwaarde te hebben, zal deze een yield-sleutelwoord hebben.

Om een ​​generatorfunctie te maken, moet u een zoekwoord voor opbrengst toevoegen. De volgende voorbeelden laten zien hoe u een generatorfunctie maakt.

def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)

Uitgang:

HELLO

Verschil tussen normale functie versus generatorfunctie.

Laten we begrijpen hoe een generatorfunctie verschilt van een normale functie.

Er zijn 2 functies normal_test () en generator_test ().

Beide functies zijn bedoeld om de string "Hallo wereld" terug te geven. De normal_test () gebruikt return en generator_test () gebruikt yield.

# 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

Uitgang:

Hello World

De uitvoer laat zien dat wanneer je de normale functie normal_test () aanroept, deze de Hello World-string retourneert. Voor een generatorfunctie met het trefwoord yield geeft het terug en niet de string.

Dit is het belangrijkste verschil tussen een generatorfunctie en een normale functie. Om de waarde van het generatorobject te krijgen, moeten we ofwel het object binnen for-lus gebruiken of de methode next () gebruiken of gebruik maken van list ().

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

Nog een verschil om toe te voegen aan de normale functie v / s generatorfunctie is dat wanneer u een normale functie aanroept, de uitvoering start en stopt wanneer deze terugkeert en de waarde wordt teruggestuurd naar de beller. Dus wanneer de uitvoering begint, kunt u de normale functie tussendoor niet stoppen en stopt deze alleen als het return-trefwoord tegenkomt.

Maar in het geval van een generatorfunctie, zodra de uitvoering start wanneer deze de eerste opbrengst krijgt, wordt de uitvoering gestopt en wordt het generatorobject teruggegeven. U kunt het generatorobject gebruiken om de waarden op te halen en ook pauzeren en hervatten volgens uw vereisten.

Hoe lees ik de waarden van de generator?

U kunt de waarden van een generatorobject lezen met de methode list (), for-loop en next ().

Met behulp van: list ()

Een lijst is een itereerbaar object waarvan de elementen tussen haakjes staan. Het gebruik van list () op een generatorobject geeft alle waarden die de generator bevat.

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

Uitgang:

[0, 2, 4, 6, 8]

Gebruik: for-in

In het voorbeeld is er een functie gedefinieerd even_getallen () die je alle even getallen geeft voor de gedefinieerde n. De aanroep van de functie even_numbers () zal een generatorobject teruggeven, dat binnen for-lus wordt gebruikt.

Voorbeeld:

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

Uitgang:

02468

Volgende () gebruiken

De methode next () geeft je het volgende item in de lijst, array of object. Als de lijst eenmaal leeg is, en als next () wordt aangeroepen, geeft het een fout terug met het stopIteration-signaal. Deze fout van next () geeft aan dat er geen items meer in de lijst staan.

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

Uitgang:

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

Generatoren zijn eenmalig gebruik

In het geval van generatoren zijn ze slechts één keer beschikbaar voor gebruik. Als u ze opnieuw probeert te gebruiken, is deze leeg.

Bijvoorbeeld:

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

Uitgang:

02468Calling the generator again: []

Als u wilt dat de uitvoer opnieuw wordt gebruikt, moet u de aanroep opnieuw uitvoeren.

Voorbeeld: generatoren en opbrengst voor Fibonacci-serie

Het volgende voorbeeld laat zien hoe je generatoren en yield in Python kunt gebruiken. Het voorbeeld genereert de Fibonacci-reeks.

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)

Uitgang:

0112358

Voorbeeld: functie aanroepen met opbrengst

In dit voorbeeld ziet u hoe u een functie met opbrengst aanroept.

Het onderstaande voorbeeld heeft een functie genaamd test () die het kwadraat van het opgegeven getal retourneert. Er is een andere functie genaamd getSquare () die test () gebruikt met het trefwoord yield. De uitvoer geeft de kwadraatwaarde voor een opgegeven nummerreeks.

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)

Uitgang:

0149162536496481

Wanneer Yield in plaats van Return in Python moet worden gebruikt

Python3 Yield- sleutelwoord retourneert een generator naar de beller en de uitvoering van de code start alleen wanneer de generator wordt herhaald.

Een terugkeer in een functie is het einde van de functie-uitvoering, en een enkele waarde wordt teruggegeven aan de beller.

Hier is de situatie waarin u Yield zou moeten gebruiken in plaats van Return

  • Gebruik opbrengst in plaats van rendement wanneer de gegevensomvang groot is
  • Opbrengst is de beste keuze als u wilt dat uw uitvoering met grote gegevenssets sneller verloopt
  • Gebruik yield als u een grote set waarden naar de aanroepende functie wilt retourneren
  • Opbrengst is een efficiënte manier om gegevens te produceren die groot of oneindig zijn.

Opbrengst versus rendement

Hier zijn de verschillen tussen opbrengst en rendement

Opbrengst Keer terug
Yield retourneert een generatorobject naar de beller en de uitvoering van de code begint pas wanneer de generator wordt herhaald. Een terugkeer in een functie is het einde van de functie-uitvoering, en een enkele waarde wordt teruggegeven aan de beller.
Wanneer de functie wordt aangeroepen en het trefwoord yield tegenkomt, stopt de uitvoering van de functie. Het retourneert het generatorobject terug naar de beller. De uitvoering van de functie start alleen als het generatorobject wordt uitgevoerd. Wanneer de functie wordt aangeroepen, begint de uitvoering en wordt de waarde teruggegeven aan de beller als er een return-sleutelwoord is. De terugkeer binnen de functie markeert het einde van de functie-uitvoering.
uitdrukking geven terugkeer uitdrukking
Er wordt geen geheugen gebruikt wanneer het trefwoord yield wordt gebruikt. Het geheugen wordt toegewezen voor de geretourneerde waarde.
Zeer handig als u te maken heeft met een enorme datagrootte omdat het geheugen niet wordt gebruikt. Handig voor een zeer kleine gegevensgrootte.
De prestaties zijn beter als het zoekwoord rendement wordt gebruikt voor een grote gegevensomvang. Er wordt veel geheugen gebruikt als de datagrootte enorm is, wat de prestaties zal belemmeren.
De uitvoeringstijd is sneller in het geval van opbrengst voor grote gegevensomvang. De gebruikte uitvoeringstijd is meer omdat er extra verwerking wordt uitgevoerd in het geval dat uw gegevensomvang enorm is, dit prima zal werken voor kleine gegevensomvang.

Overzicht:

  • Het trefwoord yield in python werkt als een return, met het enige verschil dat in plaats van een waarde te retourneren, het een generatorfunctie teruggeeft aan de beller.
  • Een generator is een speciaal type iterator dat, eenmaal gebruikt, niet meer beschikbaar zal zijn. De waarden worden niet in het geheugen opgeslagen en zijn alleen beschikbaar als ze worden opgeroepen.
  • De waarden van de generator kunnen worden gelezen met de methode for-in, list () en next ().
  • Het belangrijkste verschil tussen yield en return is dat yield een generatorfunctie teruggeeft aan de beller en return geeft een enkele waarde aan de beller.
  • Yield slaat geen van de waarden op in het geheugen, en het voordeel is dat het handig is als de gegevensomvang groot is, aangezien geen van de waarden in het geheugen wordt opgeslagen.
  • De prestaties zijn beter als het zoekwoord rendement wordt gebruikt in vergelijking met rendement voor grote gegevensomvang.