Python Academy · Lektion

Generatorfunktioner

Producér værdier dovent med yield

Lektion 2 af 413 trin

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:

  • yield sæ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.

Gratis at komme i gang

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

  1. Iterator-protokollen
  2. Generatorfunktioner
  3. Generatorekspressioner
  4. yield from og delegering
← Tilbage til Python Academy