Inleiding tot Python-generatoren

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.

Basics

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.

Python Iterators

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.

Itereren over een woordenboek

d = 'x': 10, 'y': 20, 'z': 30 voor k, v in d.items (): print k, v #result # y 20 # x 10 # z 30 

Itereren over rijen in een CSV-bestand

import csv met open ('file.csv', newline = ") als Bestand: reader = csv.reader (Bestand) voor rij in lezer: opbrengst rij

Itereren over een string

my_string = 'Generators' voor string in my_string: print (string) #resultaat # G # e # n # e # r # a # t # o # r # s

Voordelen van het gebruik van generatoren

Laten we enkele voordelen bespreken van het gebruik van generatoren in tegenstelling tot iterators:

Eenvoudig te implementeren

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.

Minder geheugenverbruik

Generators helpen het geheugengebruik te minimaliseren, vooral als het gaat om grote gegevenssets, omdat een generator slechts één item tegelijk retourneert.

Betere prestaties en optimalisatie

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.

Hoe een generator aanmaken in Python

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

Hoe Python-generatoren werken

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, in  StopIterationNormale functie 

Voorbeeld 2

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.

Conclusie

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.