Lær, hvordan denne alternative funktionstype kan hjælpe dig med at reducere hukommelsesfodaftryk.
Hvis du læser linjer fra en logfil eller behandler en lang liste over elementer, er en mulighed at indlæse alle data i hukommelsen. Denne tilgang kan dog bruge meget hukommelse og hindre ydeevnen. Generatorer tilbyder en værdifuld løsning.
Generatorer eliminerer behovet for at indlæse alle data i hukommelsen samtidigt. De er nyttige, når du håndterer store datasæt, uendelige sekvenser eller ethvert scenarie, hvor hukommelseseffektivitet er altafgørende.
Hvad er generatorer?
En generator er en speciel funktion, der lader dig iterere over en række værdier. I stedet for at returnere et komplet sæt data, genererer de – eller giver – én værdi ad gangen. Dette gør dem effektive til at arbejde med store eller ubegrænsede datasekvenser.
EN almindelig Python-funktion beregner typisk en værdi og returnerer den. Men generatorer fungerer anderledes. De kan give flere værdier over tid ved at standse og genoptage eksekveringen mellem hvert udbytte.
Nøgleforskellen mellem almindelige funktioner og generatorer er, at i stedet for at bruge Vend tilbage nøgleord for at producere et resultat, generatorer bruger udbytte.
Sådan opretter du en generator
For at oprette en generator, i stedet for Vend tilbage erklæring, brug en udbytte erklæring i funktionen. Det udbytte nøgleordet instruerer ikke kun funktionen til at returnere en værdi, men lader den også gemme sin tilstand, hvilket giver mulighed for fremtidig genoptagelse.
Her er et eksempel på en simpel generatorfunktion:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Denne generatorfunktion giver numeriske værdier fra 1 til 3.
Det udbytte statement gemmer funktionens tilstand, bevarer lokale variabler mellem opkald, for at genoptage, når du anmoder om den næste værdi.
Ved at tildele en generatorfunktion til en variabel oprettes et generatorobjekt, du kan arbejde med.
Arbejde med generatorer
Generatorer har flere applikationer. Du kan bruge dem ind for sløjfer eller inden for listeforståelser, såvel som andre iterable strukturer. Generatorer kan også tjene som argumenter for funktioner.
Når du har oprettet en generator, kan du iterere over den ved hjælp af en for-løkke:
for i in numeric_generator():
print(i)
Du kan også bruge Næste funktion til at hente værdier én efter én:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Dette giver dig mere kontrol over generatorobjektet.
Generatorer kan holde styr på deres tilstand. Hver afkastsætning i en funktion fungerer som et kontrolpunkt. Når du ringer til Næste() funktion på generatorobjektet, afhentes eksekvering fra det forrige udbyttepunkt.
Du kan også overføre værdier til en generator vha 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 + ygen = 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)
Det sende() metode lader dig hente værdier fra generatoren og sende værdier tilbage til generatorfunktionen, hvilket effektivt sætter den på pause og giver dig mulighed for at kontrollere dens udførelse. Det sende() metoden er praktisk, når du skriver coroutiner eller bruger generatorer til avancerede formål.
Brug af generatorudtryk
Generatorudtryk giver en kortfattet måde at skabe en enkel og anonym generator på. De ligner listeforståelser, men bruger parenteser i stedet for parenteser.
Her er et eksempel:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Koden skaber et generatorudtryk, der giver kvadraterne af tallene 0 til 9. Generatorudtryk er ideelle til dovent generering af en række værdier.
Brug af generatorer til databehandling
Python-generatorer er en bekvem måde at beskrive datastrømme og bygge iteratorer på uden at holde alt i hukommelsen. Du kan forbedre din programmering markant ved at lære at bruge generatorer, hvilket gør det nemmere at håndtere udfordrende databehandlingsopgaver.
Næste gang du arbejder med store datasæt, skal du huske på generatorerne og delegere de arbejdskrævende opgaver til dem, så din kode forbliver lydhør og effektiv.