Python Academy · leksjon

Generatorfunksjoner

Produser verdier lat med yield

Leksjon 2 av 413 trinn

Generatorfunksjoner er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva er en generator?

En generatorfunksjon ser ut som en vanlig funksjon, men bruker yield i stedet for, eller sammen med, return. Når De kaller den, kjøres ikke funksjonskroppen. I stedet returneres et generatorobjekt, som er en iterator.

def gen():
    yield 1
    yield 2
    yield 3

g = gen()
print(type(g).__name__)
print(list(g))

yield setter kjøringen på pause

Hver gang De kaller next(), kjører funksjonen til den treffer yield, returnerer denne verdien og fryser tilstanden. Neste kall fortsetter rett etter yield.

def steps():
    print('start')
    yield 'a'
    print('resumed')
    yield 'b'

g = steps()
print(next(g))
print(next(g))

Løkking over en generator

Ettersom en generator er en iterator, driver en for-løkke den automatisk og stopper når funksjonen avsluttes (noe som internt utløser StopIteration).

def countdown(n):
    while n > 0:
        yield n
        n -= 1

for x in countdown(4):
    print(x)

Lat evaluering

Generatorer er late: Verdier produseres bare når de etterspørres. Dermed kan De modellere svært lange eller uendelige sekvenser uten å bruke mye minne.

def naturals():
    n = 1
    while True:
        yield n
        n += 1

g = naturals()
print(next(g), next(g), next(g))

Tilstand mellom yield-uttrykk

Lokale variabler beholder verdiene sine mellom yield-punktene. En generator husker naturlig hvor den slapp, uten at De må holde styr på en indeks manuelt.

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 å bygge en liste

En vanlig funksjon bygger og returnerer hele listen på én gang. En generator gir fra seg elementer ved behov. Bruk en generator når sekvensen er stor, eller når De kanskje avslutter tidlig.

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)))

Avslutte tidlig

Ettersom produksjonen er lat, kan De gå ut av en løkke, og generatoren beregner ganske enkelt aldri 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

En return uten verdi i en generator avslutter den ganske enkelt (og utløser StopIteration). En eventuell verdi De returnerer, blir exceptionens value-attributt, 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 bare brukes én gang

Som alle iteratorer forbrukes en generator én gang. Etter at den er tømt, gir den ikke fra seg flere verdier. Kall funksjonen på nytt for å 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 gjør det enkelt å bygge ryddige datapipelines. Her gir vi bare fra oss partallene, ett om gangen.

def evens(numbers):
    for n in numbers:
        if n % 2 == 0:
            yield n

print(list(evens(range(10))))

Kjede sammen generatorer

En generator kan forbruke en annen generator og dermed bygge en pipeline med flere trinn, der hvert trinn er lat.

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))))

Hurtigsjekk

Test forståelsen Deres av generatorfunksjoner.

Oppsummering

De har lært om generatorfunksjoner:

  • yield setter kjøringen på pause og fortsetter den senere, samtidig som lokal tilstand bevares.
  • Når funksjonen kalles, returneres et lat generatorobjekt.
  • De bruker lite minne og egner seg godt til pipelines og uendelige datastrømmer.
  • De kan bare brukes én gang, akkurat som alle iteratorer.

Deretter skal De se på de enda mer kompakte generatoruttrykkene.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Generatorfunksjoner» gratis?

Ja – hele teksten i «Generatorfunksjoner» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Generatorfunksjoner»?

Produser verdier lat med yield Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Generatorfunksjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Iteratorprotokollen
  2. Generatorfunksjoner
  3. Generatorekspresjoner
  4. yield from og delegering
← Tilbake til Python Academy