Finn ut hvordan denne alternative funksjonstypen kan hjelpe deg med å redusere minneavtrykket.

Hvis du leser linjer fra en loggfil eller behandler en lang liste med elementer, er ett alternativ å laste inn hele dataen i minnet. Imidlertid kan denne tilnærmingen bruke mye minne og hindre ytelsen. Generatorer tilbyr en verdifull løsning.

Generatorer eliminerer behovet for å laste alle data inn i minnet samtidig. De er nyttige når du håndterer store datasett, uendelige sekvenser eller ethvert scenario der minneeffektivitet er avgjørende.

Hva er generatorer?

En generator er en spesiell funksjon som lar deg iterere over en sekvens av verdier. I stedet for å returnere et komplett sett med data, genererer de – eller gir – én verdi om gangen. Dette gjør dem effektive for å arbeide med store eller ubegrensede datasekvenser.

EN vanlig Python-funksjon beregner vanligvis en verdi og returnerer den. Men generatorer fungerer annerledes. De kan gi flere verdier over tid ved å sette på pause og gjenoppta kjøringen mellom hver avkastning.

instagram viewer

Nøkkelforskjellen mellom vanlige funksjoner og generatorer er at i stedet for å bruke komme tilbake nøkkelord for å produsere et resultat, bruker generatorer utbytte.

Hvordan lage en generator

For å lage en generator, i stedet for komme tilbake uttalelse, bruk en utbytte uttalelse i funksjonen. De utbytte nøkkelord instruerer ikke bare funksjonen til å returnere en verdi, men lar den også lagre tilstanden, slik at den kan gjenopptas i fremtiden.

Her er et eksempel på en enkel generatorfunksjon:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Denne generatorfunksjonen gir numeriske verdier fra 1 til 3.

De utbytte setningen lagrer funksjonens tilstand, bevarer lokale variabler mellom samtaler, for å gjenopptas når du ber om neste verdi.

Å tilordne en generatorfunksjon til en variabel oppretter et generatorobjekt du kan jobbe med.

Arbeide med generatorer

Generatorer har flere applikasjoner. Du kan bruke dem inn for løkker eller innenfor listeforståelser, så vel som andre iterable strukturer. Generatorer kan også tjene som argumenter for funksjoner.

Når du har opprettet en generator, kan du iterere over den ved å bruke en for-løkke:

for i in numeric_generator():
print(i)

Du kan også bruke neste funksjon for å hente verdier én etter én:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Dette gir deg mer kontroll over generatorobjektet.

Generatorer kan holde styr på tilstanden deres. Hver avkastningserklæring i en funksjon fungerer som et sjekkpunkt. Når du ringer neste() funksjon på generatorobjektet, henter utførelse opp fra forrige flytepunkt.

Du kan også sende verdier inn i en generator ved å bruke sende():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

De sende() metoden lar deg hente verdier fra generatoren og sende verdier tilbake til generatorfunksjonen, effektivt sette den på pause og lar deg kontrollere utførelsen. De sende() metoden er nyttig når du skriver koroutiner eller bruker generatorer for avanserte formål.

Bruke generatoruttrykk

Generatoruttrykk gir en kortfattet måte å lage en enkel og anonym generator på. De ligner på listeforståelser, men bruker parenteser i stedet for parenteser.

Her er et eksempel:

gen = (i**2for i in range(10))

for x in gen:
print(x)

Koden lager et generatoruttrykk som gir kvadratene til tallene 0 til 9. Generatoruttrykk er ideelle for dovent generering av en verdisekvens.

Bruke generatorer for databehandling

Python-generatorer er en praktisk måte å beskrive datastrømmer og bygge iteratorer uten å ha alt i minnet. Du kan forbedre programmeringen betraktelig ved å lære å bruke generatorer, noe som gjør det enklere å håndtere utfordrende databehandlingsoppgaver.

Neste gang du jobber med store datasett, husk generatorer og delegere arbeidskrevende oppgaver til dem, slik at koden din forblir responsiv og effektiv.