Introduksjon til Python Generators

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.

Grunnleggende

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.

Python Iteratorer

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.

Iterating over en ordbok

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

Iterering over rad i en CSV-fil

importer csv med åpen ('file.csv', newline = ") som fil: leser = csv.reader (fil) for rad i leser: gi rad

Iterering over en streng

my_string = 'Generatorer' for streng i my_string: print (streng) #result # G # e # n # e # r # a # t # o # r # s

Fordeler med å bruke generatorer

La oss diskutere noen av fordelene ved å bruke generatorer i motsetning til iteratorer:

Enkel å implementere

Å 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.

Mindre minneforbruk

Generatorer bidrar til å minimere minneforbruk, spesielt når det gjelder store datasett, fordi en generator kun vil returnere ett element om gangen.

Bedre ytelse og optimalisering

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.

Hvordan lage en generator i Python

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

Hvordan Python Generators Work

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, inn  StopIterationNormal funksjon 

Eksempel 2

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.

Konklusjon

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.