Generatorer gjør det enkelt å lage iterasjoner i Python og i retur skrive mindre kode. Denne opplæringen vil introdusere deg til Python generatorer, deres fordeler, og hvordan de fungerer.
En generator er en funksjon som returnerer et generatorobjekt som du kan ringe til neste ()
metode, slik at det for hver samtale returnerer en verdi eller neste verdi. En vanlig Python-funksjon bruker komme tilbake
søkeord for å returnere verdier, men generatorer bruker søkeordet utbytte
å returnere verdier. Dette betyr at enhver Python-funksjon som inneholder a utbytte
erklæringen er en generatorfunksjon.
De utbytte
setningen stopper vanligvis funksjonen og sparer den lokale staten slik at den kan gjenopptas akkurat der den sluttet. Generatorfunksjoner kan ha en eller flere utbytte
uttalelser.
En generator er også en iterator, men hva er en iterator? Før vi dykker inn i detaljene til generatorer, synes jeg det er viktig å vite hva iteratorer er fordi de utgjør en integrert del av denne diskusjonen.
En Python iterator er ganske enkelt en klasse som definerer en __iter __ ()
metode. De fleste Python-objekter er iterable, noe som betyr at du kan løse over hvert element i objektene. Eksempler på iterables i Python inkluderer strenger, lister, tuples, ordbøker og intervaller.
La oss vurdere eksemplet nedenfor, der vi slår over en liste med farger:
farger = ["rødt", "blått", "gul"] def my_funct (): for farger i farger: utskriftskvalitet
Bak kulissene, den til
uttalelsen vil ringe ITER ()
på listobjektet. Funksjonen returnerer deretter et iteratorobjekt som definerer metoden __next __ ()
, som vil da få tilgang til hver farge, en om gangen. Når det ikke er flere farger igjen, __next__
vil heve a StopIteration
unntak, som igjen vil informere til
sløyfe for å avslutte.
d = 'x': 10, 'y': 20, 'z': 30 for k, v i d.items (): print k, v #result # y 20 # x 10 # z 30
importer csv med åpen ('file.csv', newline = ") som fil: leser = csv.reader (fil) for rad i leser: gi rad
my_string = 'Generatorer' for streng i my_string: print (streng) #result # G # e # n # e # r # a # t # o # r # s
La oss diskutere noen av fordelene ved å bruke generatorer i motsetning til iteratorer:
Å bygge en iterator i Python vil kreve at du gjennomfører en klasse med __iter __ ()
og __next __ ()
metoder samt å ta vare på eventuelle feil som kan forårsake a StopIteration
feil.
Klasse Omvendt: "" "Iterator for looping over en sekvens bakover." "" def __init __ (selvdata): self.data = data self.index = len (data) def __iter __ (selv): returner selv def __next __ ): hvis self.index == 0: heve StopIteration self.index = self.index - 1 return self.data [self.index]
Som du kan se over, er implementeringen svært lang. All denne byrden håndteres automatisk av generatorer.
Generatorer bidrar til å minimere minneforbruk, spesielt når det gjelder store datasett, fordi en generator kun vil returnere ett element om gangen.
Generatorer er lat i naturen. Dette betyr at de bare genererer verdier når det kreves for å gjøre det. I motsetning til en normal iterator, hvor alle verdier genereres uavhengig av om de vil bli brukt eller ikke, genererer generatorer bare verdiene som trengs. Dette vil i sin tur føre til at programmet utføres raskere.
Å lage en generator er veldig enkelt. Alt du trenger å gjøre er å skrive en normal funksjon, men med en utbytte
setning i stedet for a komme tilbake
uttalelse, som vist nedenfor.
def gen_function (): yield "python"
Mens a komme tilbake
setningen avslutter en funksjon helt, utbytte
bare pause funksjonen til den blir ringt igjen av neste ()
metode.
For eksempel bruker programmet nedenfor bruk av begge utbytte
og neste ()
uttalelser.
def myGenerator (l): total = 1 for n i l: gi totalt totalt + = n newGenerator = myGenerator ([10,3]) print (neste (newGenerator)) print (neste (newGenerator))
La oss se hvordan generatorer fungerer. Tenk på eksemplet nedenfor.
# generator_example.py def myGenerator (l): total = 0 for n i l: total + = n utbytte totalt newGenerator = myGenerator ([10,20,30]) skriv ut (neste (newGenerator)) print (neste (newGenerator)) print (neste (newGenerator))
I funksjonen ovenfor definerer vi en generator som heter myGenerator
, som tar en liste l
som et argument. Vi definerer deretter en variabel Total
og tilordne den en verdi på null. I tillegg går vi gjennom hvert element i listen og legger det til den totale variabelen.
Vi instanser øyeblikkelig newGenerator
og ring til neste ()
metode på den. Dette kjører koden til den gir den første verdien av Total
, som vil bli 0
i dette tilfellet. Funksjonen holder da verdien av den totale variabelen til neste gang funksjonen kalles. I motsetning til en normal komme tilbake
setning, som vil returnere alle verdiene samtidig, vil generatoren hente fra hvor den sluttet.
Nedenfor er de gjenværende etterfølgende verdiene.
# generator_example.py def myGenerator (l): total = 0 for n i l: gi totalt totalt + = n newGenerator = myGenerator ([10,20,30]) skriv ut (neste (newGenerator)) print (neste (newGenerator)) skriv ut (neste (newGenerator)) # resultat # 0 # 10 # 30
Hvis du prøver å ringe funksjonen etter at den har fullført løkken, får du en StopIteration
feil.
EN StopIteration
er hevet av neste ()
metode for å signalisere at det ikke er noen andre gjenstander produsert av iteratoren.
0 10 30 Traceback (siste anrop sist): Fil "python", linje 15, innStopIterationNormal funksjon
I dette eksemplet viser vi hvordan du bruker flere avkastningsuttalelser i en funksjon.
# colors.py def colors (): yield "red" yield "blue" yield "green" next_color = colors () print (neste (next_color)) skriv ut (neste (next_color)) print rød # blå # grønn
Mens en normal funksjon returnerer alle verdiene når funksjonen kalles, venter en generator til neste ()
Metoden kalles igjen. En gang neste ()
kalles, fargene funksjonen fortsetter fra hvor den ble stoppet.
Generatorer er mer minneeffektive, spesielt når de jobber med svært store lister eller store objekter. Dette skyldes at du kan bruke utbytter til å jobbe på mindre biter enn å ha hele dataene i minnet alt på en gang.
I tillegg må du ikke glemme å se hva vi har tilgjengelig for salg og for studier på Envato Market, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved å bruke feedet under.
Videre, hvis du føler deg fast, er det en veldig god kurs på Python generatorer i kursavsnittet.