Generators maken het eenvoudig om iteraties te maken in Python en in ruil daarvoor minder code te schrijven. Deze tutorial zal je introduceren bij Python-generatoren, hun voordelen en hoe ze werken.
Een generator is een functie die een generatorobject retourneert waarop u de. Kunt oproepen next ()
methode, zodat voor elke oproep een waarde of de volgende waarde wordt geretourneerd. Een normale Python-functie gebruikt de terugkeer
sleutelwoord om waarden te retourneren, maar generatoren gebruiken het sleutelwoord opbrengst
om waarden te retourneren. Dit betekent dat elke Python-functie die een opbrengst
statement is een generatorfunctie.
De opbrengst
verklaring stopt meestal de functie en slaat de lokale staat op zodat deze kan worden hervat op de plek waar deze is gebleven. Generatorfuncties kunnen een of meer functies hebben opbrengst
statements.
Een generator is ook een iterator, maar wat is een iterator? Voordat we ingaan op de details van generatoren, denk ik dat het belangrijk is om te weten wat iterators zijn omdat ze een integraal onderdeel vormen van deze discussie.
Een Python-iterator is gewoon een klasse die een definieert __iter __ ()
methode. De meeste Python-objecten zijn iterabel, wat betekent dat je elk element in de objecten kunt herhalen. Voorbeelden van iterables in Python zijn strings, lists, tuples, dictionary's en ranges.
Laten we het onderstaande voorbeeld bekijken, waarin we een lijst met kleuren doorlopen:
kleuren = ["rood", "blauw", "geel"] def my_funct (): voor kleuren in kleuren: printkleur
Achter de schermen, de voor
verklaring zal bellen iter ()
op het lijstobject. De functie retourneert vervolgens een iterator-object dat de methode definieert __next __ ()
, die dan toegang heeft tot elke kleur, één voor één. Wanneer er geen kleuren meer over zijn, __next__
zal een verhogen StopIteration
uitzondering, die op zijn beurt de voor
loop om te beëindigen.
d = 'x': 10, 'y': 20, 'z': 30 voor k, v in d.items (): print k, v #result # y 20 # x 10 # z 30
import csv met open ('file.csv', newline = ") als Bestand: reader = csv.reader (Bestand) voor rij in lezer: opbrengst rij
my_string = 'Generators' voor string in my_string: print (string) #resultaat # G # e # n # e # r # a # t # o # r # s
Laten we enkele voordelen bespreken van het gebruik van generatoren in tegenstelling tot iterators:
Het bouwen van een iterator in Python vereist dat je een klasse implementeert met __iter __ ()
en __next __ ()
methoden en het zorgen voor eventuele fouten die kunnen leiden tot een StopIteration
fout.
class Reverse: "" "Iterator voor achterwaartse lussen over een reeks." "" def __init __ (self, data): self.data = data self.index = len (data) def __iter __ (zelf): return self def __next __ (self ): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data [self.index]
Zoals je hierboven kunt zien, is de implementatie erg lang. Al deze lasten worden automatisch afgehandeld door generatoren.
Generators helpen het geheugengebruik te minimaliseren, vooral als het gaat om grote gegevenssets, omdat een generator slechts één item tegelijk retourneert.
Generators zijn lui van aard. Dit betekent dat ze alleen waar nodig waarden genereren. In tegenstelling tot een normale iterator, waarbij alle waarden worden gegenereerd, ongeacht of ze worden gebruikt of niet, genereren generatoren alleen de benodigde waarden. Dit zal op zijn beurt leiden tot een snellere uitvoering van uw programma.
Het maken van een generator is heel eenvoudig. Het enige dat u hoeft te doen is een normale functie schrijven, maar dan met opbrengst
verklaring in plaats van een terugkeer
verklaring, zoals hieronder getoond.
def gen_function (): opbrengst "python"
Terwijl een terugkeer
statement beëindigt een functie volledig, opbrengst
pauzeert gewoon de functie totdat deze opnieuw wordt aangeroepen door de next ()
methode.
Het onderstaande programma maakt bijvoorbeeld gebruik van beide opbrengst
en next ()
statements.
def myGenerator (l): totaal = 1 voor n in l: opbrengst totaal totaal + = n nieuwGenerator = myGenerator ([10,3]) print (volgende (newGenerator)) print (volgende (newGenerator))
Laten we eens kijken hoe generatoren werken. Bekijk het onderstaande voorbeeld.
# generator_example.py def myGenerator (l): totaal = 0 voor n in l: totaal + = n opbrengst totaal newGenerator = myGenerator ([10,20,30]) print (volgende (newGenerator)) print (volgende (newGenerator)) afdrukken (next (newGenerator))
In de bovenstaande functie definiëren we een generator met de naam myGenerator
, welke een lijst neemt l
als een argument. Vervolgens definiëren we een variabele totaal
en wijs er een waarde van nul aan toe. Bovendien doorlopen we elk element in de lijst en voegen het vervolgens toe aan de totale variabele.
We instantiëren dan newGenerator
en bel de next ()
methode erop. Hiermee wordt de code uitgevoerd totdat deze de eerste waarde oplevert van totaal
, welke zal zijn 0
in dit geval. De functie behoudt dan de waarde van de totale variabele tot de volgende keer dat de functie wordt aangeroepen. In tegenstelling tot een normaal terugkeer
verklaring, die alle waarden in één keer zal teruggeven, zal de generator oppikken van waar hij was gebleven.
Hieronder staan de resterende volgende waarden.
# generator_example.py def myGenerator (l): total = 0 for n in l: yield total total + = n newGenerator = myGenerator ([10,20,30]) print (next (newGenerator)) print (volgende (newGenerator)) print (volgende (newGenerator)) # resultaat # 0 # 10 # 30
Als u de functie probeert te bellen nadat de lus is voltooid, krijgt u een StopIteration
fout.
EEN StopIteration
wordt opgevoed door de next ()
methode om aan te geven dat er geen andere items zijn die door de iterator zijn geproduceerd.
0 10 30 Traceback (laatste oproep laatste): Bestand "python", regel 15, inStopIterationNormale functie
In dit voorbeeld laten we zien hoe meerdere rendementsoverzichten in een functie kunnen worden gebruikt.
# colors.py def kleuren (): opbrengst "rood" opbrengst "blauw" opbrengst "groen" volgende_kleur = kleuren () afdrukken (volgende (volgende_kleur)) afdrukken (volgende (volgende_kleur)) afdrukken (volgende (volgende_kleur)) # resultaat # rood # blauw # groen
Terwijl een normale functie alle waarden retourneert wanneer de functie is opgeroepen, wacht een generator tot de next ()
methode wordt opnieuw gebeld. Een keer next ()
wordt genoemd, wordt de functie voor kleuren hervat vanaf de plaats waar deze was gestopt.
Generators zijn meer geheugenefficiënt, vooral wanneer ze werken met zeer grote lijsten of grote objecten. Dit komt omdat u opbrengsten kunt gebruiken om op kleinere bits te werken in plaats van de hele gegevens in het geheugen in één keer te hebben.
Vergeet bovendien niet te zien wat we te koop hebben en te studeren op Envato Market, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.
Bovendien, als je het gevoel hebt vast te zitten, is er een zeer goede cursus over Python-generatoren in de cursussectie.