Generatorfunksjoner
Produser verdier lat med yield
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:
yieldsetter 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.
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
- Iteratorprotokollen
- Generatorfunksjoner
- Generatorekspresjoner
- yield from og delegering