Generatorfunktioner
Producér værdier dovent med yield
Generatorfunktioner er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad er en generator?
En generatorfunktion ligner en normal funktion, men bruger yield i stedet for eller sammen med return. Når du kalder den, udføres funktionskroppen ikke; den returnerer et generatorobjekt, som er en iterator.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))yield sætter udførelsen på pause
Hver gang du kalder next(), kører funktionen, indtil den rammer et yield, returnerer den pågældende værdi og sætter sin tilstand på pause. Det næste kald fortsætter lige efter yield.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))Gennemløb af en generator
Fordi en generator er en iterator, driver en for-løkke den automatisk og stopper, når funktionen afsluttes, hvilket internt udløser StopIteration.
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)Doven evaluering
Generatorer er dovne: Værdier produceres kun, når der bliver bedt om dem. Det betyder, at du kan modellere meget store eller uendelige sekvenser uden at bruge meget hukommelse.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))Tilstand mellem yield-kald
Lokale variabler bevarer deres værdier mellem yield-punkter. En generator husker naturligt, hvor den slap, uden at du manuelt skal holde styr på et indeks.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])Generatorer sammenlignet med at opbygge en liste
En almindelig funktion opbygger og returnerer hele listen på én gang. En generator leverer elementer efter behov. Brug en generator, når sekvensen er stor, eller når du måske stopper tidligt.
def squares_list(n):
result = []
for i in range(n):
result.append(i * i)
return result
def squares_gen(n):
for i in range(n):
yield i * i
print(squares_list(5))
print(list(squares_gen(5)))Stop tidligt
Fordi værdierne genereres dovent, kan du afbryde en løkke, hvorefter generatoren ganske enkelt aldrig beregner resten.
def naturals():
n = 1
while True:
print('producing', n)
yield n
n += 1
for x in naturals():
if x > 3:
break
print('got', x)return i en generator
Et tomt return afslutter ganske enkelt generatoren og udløser StopIteration. En værdi, du returnerer, bliver undtagelsens value-attribut, som de fleste løkker ignorerer.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))Generatorer kan kun bruges én gang
Ligesom alle iteratorer bliver en generator opbrugt efter én gennemløbning. Når den er tømt, leverer den ingen flere værdier. Kald funktionen igen for at få en ny generator.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))Filtrering med generatorer
Generatorer gør det nemt at opbygge rene databehandlingskæder. Her leverer vi kun de lige tal, ét ad gangen.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))Kædning af generatorer
En generator kan gennemløbe en anden generator, så du kan opbygge en databehandlingskæde i flere trin, hvor hvert trin er dovent.
def numbers(n):
for i in range(n):
yield i
def doubled(src):
for x in src:
yield x * 2
print(list(doubled(numbers(5))))Hurtigt tjek
Tjek din forståelse af generatorfunktioner.
Opsummering
Du har lært om generatorfunktioner:
yieldsætter udførelsen på pause og genoptager den, samtidig med at den lokale tilstand bevares.- Når du kalder funktionen, returneres et dovent generatorobjekt.
- De er hukommelsesvenlige og velegnede til databehandlingskæder og uendelige datastrømme.
- De kan kun bruges én gang, ligesom alle iteratorer.
Næste emne er de endnu mere kompakte generatorudtryk.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “Generatorfunktioner” gratis?
Ja — hele teksten til “Generatorfunktioner” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Generatorfunktioner”?
Producér værdier dovent med yield Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Generatorfunktioner”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Iterator-protokollen
- Generatorfunktioner
- Generatorekspressioner
- yield from og delegering