Lär dig hur denna alternativa funktionstyp kan hjälpa dig att minska minnesfotavtrycket.

Om du läser rader från en loggfil eller bearbetar en lång lista med objekt, är ett alternativ att ladda hela datan i minnet. Men detta tillvägagångssätt kan använda mycket minne och hindra prestanda. Generatorer erbjuder en värdefull lösning.

Generatorer eliminerar behovet av att ladda all data till minnet samtidigt. De är användbara när du hanterar stora datamängder, oändliga sekvenser eller andra scenarier där minneseffektivitet är av största vikt.

Vad är generatorer?

En generator är en speciell funktion som låter dig iterera över en sekvens av värden. Istället för att returnera en komplett uppsättning data genererar de – eller ger – ett värde i taget. Detta gör dem effektiva för att arbeta med stora eller obegränsade datasekvenser.

A vanlig Python-funktion beräknar vanligtvis ett värde och returnerar det. Men generatorer fungerar annorlunda. De kan ge flera värden över tiden genom att pausa och återuppta exekvering mellan varje avkastning.

instagram viewer

Den viktigaste skillnaden mellan vanliga funktioner och generatorer är att istället för att använda lämna tillbaka nyckelord för att producera ett resultat som generatorer använder avkastning.

Hur man skapar en generator

För att skapa en generator, istället för lämna tillbaka uttalande, använd a avkastning uttalande inom funktionen. De avkastning nyckelordet instruerar inte bara funktionen att returnera ett värde utan låter den också spara dess tillstånd, vilket möjliggör framtida återupptagande.

Här är ett exempel på en enkel generatorfunktion:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Denna generatorfunktion ger numeriska värden från 1 till 3.

De avkastning satsen sparar funktionens tillstånd, bevarar lokala variabler mellan anrop, för att återupptas när du begär nästa värde.

Genom att tilldela en generatorfunktion till en variabel skapas ett generatorobjekt som du kan arbeta med.

Arbeta med generatorer

Generatorer har flera applikationer. Du kan använda dem in för loopar eller inom listuppfattningar, såväl som andra itererbara strukturer. Generatorer kan också fungera som argument för funktioner.

När du har skapat en generator kan du iterera över den med en for-loop:

for i in numeric_generator():
print(i)

Du kan också använda Nästa funktion för att hämta värden en efter en:

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

Detta ger dig mer kontroll över generatorobjektet.

Generatorer kan hålla reda på sitt tillstånd. Varje avkastningsangivelse i en funktion fungerar som en kontrollpunkt. När du ringer till Nästa() funktionen på generatorobjektet plockar exekveringen upp från föregående flytgräns.

Du kan också skicka värden till en generator med hjälp av skicka():

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 skicka() metoden låter dig hämta värden från generatorn och skicka värden tillbaka till generatorfunktionen, vilket effektivt pausar den och låter dig kontrollera dess exekvering. De skicka() metoden är praktisk när du skriver koroutiner eller använder generatorer för avancerade ändamål.

Använda generatoruttryck

Generatoruttryck ger ett kortfattat sätt att skapa en enkel och anonym generator. De liknar listuppfattningar men använder parenteser istället för parenteser.

Här är ett exempel:

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

for x in gen:
print(x)

Koden skapar ett generatoruttryck som ger kvadraterna av talen 0 till 9. Generatoruttryck är idealiska för att lätta generera en sekvens av värden.

Använda generatorer för databehandling

Python-generatorer är ett bekvämt sätt att beskriva dataströmmar och bygga iteratorer utan att ha allt i minnet. Du kan förbättra din programmering avsevärt genom att lära dig att använda generatorer, vilket gör det lättare att hantera utmanande databearbetningsuppgifter.

Nästa gång du arbetar med stora datamängder, ha generatorer i åtanke och delegera de arbetskrävande uppgifterna till dem, så att din kod förblir lyhörd och effektiv.