Opbrengst binnen Python Tutorial: Generator & Voorbeeld van rendement versus rendement
Wat is Python opbrengst?
Het yield-trefwoord in Python werkt als een return met de enige
Het verschil is dat er in plaats van een waarde, een generatorobject aan de aanroeper wordt teruggegeven.
Wanneer een functie wordt aangeroepen en de uitvoeringsthread een yield-trefwoord in de functie vindt, stopt de uitvoering van de functie op die regel en wordt er een generatorobject teruggestuurd naar de aanroeper.
Syntaxis
yield expression
Beschrijving
Python yield retourneert een generatorobject. Generators zijn speciale functies die moeten worden herhaald om de waarden te verkrijgen.
Het trefwoord yield converteert de gegeven expressie 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 yield zijn gegeven.
Voorbeeld: Opbrengstmethode
Hier is een eenvoudig voorbeeld van opbrengst. De functie testyield() heeft een yield-trefwoord 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)
Output:
<generator object testyield at 0x00000028265EB9A8>
De uitvoer die wordt gegeven is een generatorobject, dat de waarde heeft die we hebben opgegeven.
Maar we krijgen niet de boodschap die we moeten geven om output op te leveren!
Om het bericht af te drukken dat aan yield is gegeven, moet het generatorobject worden herhaald zoals in het onderstaande voorbeeld wordt getoond:
def testyield():
yield "Welcome to Guru99 Python Tutorials"
output = testyield()
for i in output:
print(i)
Output:
Welcome to Guru99 Python Tutorials
Wat zijn Generators in Python?
Generators zijn functies die een itereerbaar generatorobject retourneren. De waarden van het generatorobject worden รฉรฉn voor รฉรฉn opgehaald in plaats van de volledige lijst samen en om de werkelijke waarden te krijgen, kunt u een for-loop gebruiken, met behulp van de next()- of list()-methode.
gebruik Generator functie
U kunt generatoren maken met behulp van de generatorfunctie en de generatorexpressie.
Een generatorfunctie is vergelijkbaar met een normale functie. In plaats van een retourwaarde heeft deze een yield-trefwoord.
Om een โโgeneratorfunctie te maken, moet u een yield-trefwoord 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)
Output:
H E L L O
Verschil tussen normale functie v/s Generator functie.
Laten we eens kijken hoe een generatorfunctie verschilt van een normale functie.
Er zijn 2 functies: normal_test() en generator_test().
Beide functies moeten de string โHello Worldโ retourneren. Normal_test() gebruikt return en generator_test() gebruikt 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
Output:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
De uitvoer laat zien dat wanneer u de normale functie normal_test() aanroept, deze Hello World string retourneert. Voor een generatorfunctie met het trefwoord yield retourneert deze en niet het touwtje.
Dit is het belangrijkste verschil tussen een generatorfunctie en een normale functie. Om de waarde van het generatorobject te krijgen, moeten we nu het object binnen de for-lus gebruiken of de next()-methode gebruiken of gebruikmaken van list().
print(next(generator_test())) # will output Hello World
Nog een verschil dat toegevoegd moet worden aan de normale functie versus de generatorfunctie is dat wanneer u een normale functie aanroept, de uitvoering start en stopt wanneer deze bereikt is. terugkeer en de waarde wordt teruggestuurd naar de beller. Dus wanneer de uitvoering begint, kunt u de normale functie ertussen niet stoppen en deze stopt alleen als het return-trefwoord tegenkomt.
Maar in het geval van de generatorfunctie stopt de uitvoering zodra de uitvoering start wanneer het de eerste yield krijgt en geeft het het generatorobject terug. 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 uit een generatorobject lezen met behulp van een list(), for-loop en de next()-methode.
Met behulp van: lijst()
Een lijst is een itereerbaar object waarvan de elementen tussen haakjes staan. Door list() te gebruiken op een generatorobject worden alle waarden weergegeven die de generator bevat.
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(list(num))
Output:
[0, 2, 4, 6, 8]
Gebruik: for-in
In het voorbeeld is er een functie gedefinieerd even_numbers() die u alle even getallen geeft voor de n gedefinieerd. De aanroep van de functie even_numbers() retourneert een generatorobject, dat wordt gebruikt binnen de for-loop.
Voorbeeld:
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)
Output:
0 2 4 6 8
Volgende() gebruiken
De methode next() geeft u het volgende item in de lijst, array of object. Zodra de lijst leeg is en next() wordt aangeroepen, zal deze een fout teruggeven 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 x
num = even_numbers(10)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
Output:
0
2
4
6
8
Traceback (most recent call last):
File "main.py", line 11, in <module>
print(next(num))
StopIteration
Generators zijn eenmalig gebruik
In het geval van generatoren zijn ze slechts รฉรฉn keer beschikbaar voor gebruik. Als u ze opnieuw probeert te gebruiken, zijn ze leeg.
Bijvoorbeeld:
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))
Output:
0 2 4 6 8 Calling the generator again: []
Als u wilt dat de uitvoer opnieuw wordt gebruikt, moet u opnieuw aanroepen om te functioneren.
Voorbeeld: Generators en opbrengst voor de Fibonacci-serie
Het volgende voorbeeld laat zien hoe u generatoren en opbrengsten kunt gebruiken in Python. Het voorbeeld genereert de Fibonacci-reeks.
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)
Output:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Voorbeeld: oproepfunctie met rendement
In dit voorbeeld ziet u hoe u een functie met opbrengst kunt aanroepen.
Het onderstaande voorbeeld heeft een functie genaamd test() die het kwadraat van het gegeven getal retourneert. Er is nog een functie genaamd getSquare() die test() gebruikt met het trefwoord yield. De uitvoer geeft de kwadratische waarde voor een bepaald nummerbereik.
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)
Output:
0 1 4 9 16 25 36 49 64 81
Wanneer moet u rendement gebruiken in plaats van rendement? Python
Python3 Opbrengst Het trefwoord retourneert een generator aan de aanroeper en de uitvoering van de code start pas wanneer de generator wordt herhaald.
A terugkeer in een functie is het einde van de uitvoering van de functie, en een enkele waarde wordt teruggegeven aan de aanroeper.
Dit is de situatie waarin u Rendement in plaats van Rendement zou moeten gebruiken
- Gebruik rendement in plaats van rendement als de gegevensgrootte groot is
- Opbrengst is de beste keuze als u sneller wilt kunnen werken met grote datasets
- Gebruik yield als u een grote reeks waarden wilt retourneren naar de aanroepende functie
- Opbrengst is een efficiรซnte manier om gegevens te produceren die groot of oneindig zijn.
Opbrengst versus rendement
Hier zijn de verschillen tussen rendement en rendement
| Opbrengst | Retourneren |
|---|---|
| Yield retourneert een generatorobject aan de aanroeper en de uitvoering van de code start pas wanneer de generator wordt herhaald. | Een return in een functie is het einde van de uitvoering van de functie, en er wordt een enkele waarde teruggegeven aan de aanroeper. |
| Wanneer de functie wordt aangeroepen en het yield-trefwoord tegenkomt, stopt de uitvoering van de functie. Het retourneert het generatorobject terug naar de aanroeper. De uitvoering van de functie start pas wanneer het generatorobject wordt uitgevoerd. | Wanneer de functie wordt aangeroepen, start de uitvoering en wordt de waarde teruggegeven aan de aanroeper als er een return-trefwoord is. De return binnen de functie markeert het einde van de uitvoering van de functie. |
| expressie opleveren | uitdrukking teruggeven |
| Er wordt geen geheugen gebruikt wanneer het trefwoord yield wordt gebruikt. | Het geheugen wordt toegewezen voor de geretourneerde waarde. |
| Erg handig als je te maken hebt met een enorme dataomvang omdat het geheugen niet wordt gebruikt. | Handig voor zeer kleine gegevensgroottes. |
| De prestaties zijn beter als het zoekwoord yield wordt gebruikt voor grote gegevensgroottes. | Er wordt veel geheugen gebruikt als de gegevensgrootte enorm is, wat de prestaties zal belemmeren. |
| De uitvoeringstijd is sneller als er sprake is van opbrengst bij grote gegevensomvang. | De gebruikte uitvoeringstijd is langer omdat er extra verwerking wordt uitgevoerd voor het geval uw gegevensgrootte groot is, maar dit prima zal werken voor kleine gegevensgroottes. |
Samenvatting
- Het trefwoord yield in Python werkt als een return, met als enige verschil dat het geen waarde retourneert, maar een generatorfunctie teruggeeft aan de aanroeper.
- Een generator is een speciaal type iterator die, eenmaal gebruikt, niet meer beschikbaar zal zijn. De waarden worden niet in het geheugen opgeslagen en zijn alleen beschikbaar wanneer ze worden aangeroepen.
- De waarden van de generator kunnen worden gelezen met behulp van de for-in-, list()- en next()-methoden.
- Het belangrijkste verschil tussen yield en return is dat yield een generatorfunctie terugstuurt naar de aanroeper en return een enkele waarde aan de aanroeper geeft.
- Yield slaat geen van de waarden op in het geheugen, en het voordeel is dat dit handig is als de gegevensgrootte groot is, omdat geen van de waarden in het geheugen wordt opgeslagen.
- De prestaties zijn beter als het trefwoord 'rendement' wordt gebruikt in vergelijking met rendement voor grote gegevensomvang.
