Generatorekspresjoner
Skriv kompakte, late pipelines
Generatorekspresjoner er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 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.
Fra listeforståelse til generatoruttrykk
Et generatoruttrykk ser ut som en listeforståelse, men bruker parenteser i stedet for hakeparenteser. Det produserer verdier på en lat måte i stedet for å bygge en fullstendig liste.
list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))Forskjell i minnebruk
En listeforståelse oppretter alle elementene på forhånd. Et generatoruttrykk lagrer nesten ingenting før De ber om verdier. Sammenlign størrelsene deres.
import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))Iterere over et generatoruttrykk
De forbruker et generatoruttrykk på samme måte som enhver annen iterator: med en for-løkke, next() eller ved å sende det til en funksjon.
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)Filtrering med if
Legg til en if-klausul for å beholde bare elementer som passer, akkurat som i en listeforståelse.
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))Sende direkte til funksjoner
Når et generatoruttrykk er det eneste argumentet til en funksjon, kan De utelate de ekstra parentesene. Dette gir ryddigere kode og unngår å bygge en midlertidig liste.
total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)Påminnelse om at de bare kan brukes én gang
Et generatoruttrykk er tømt etter én gjennomgang, akkurat som en generatorfunksjon. Den andre iterasjonen gir ingen verdier.
gen = (x for x in range(3))
print(list(gen))
print(list(gen))Kjede sammen uttrykk
De kan sende ett generatoruttrykk inn i et annet for å bygge en lat pipeline. Ingenting beregnes før den endelige forbrukeren henter verdier.
nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))any() og all()
Generatoruttrykk egner seg svært godt sammen med any() og all(), fordi de kan kortslutte og stoppe så snart svaret er kjent.
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))Nestede løkker
På samme måte som listeforståelser støtter generatoruttrykk flere for-klausuler, som leses fra venstre mot høyre.
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))Eksempel på en lat pipeline
Her er en liten pipeline for tekstbehandling. Hvert trinn er lat, så en svært stor fil kan strømmes uten å lastes inn i sin helhet.
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))Når bør De velge hva
Bruk en listeforståelse når De trenger dataene flere ganger eller trenger indeksering. Bruk et generatoruttrykk for strømming i én gjennomgang eller for store datamengder.
data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)Hurtigsjekk
Test forståelsen Deres av generatoruttrykk.
Oppsummering
De har lært om generatoruttrykk:
- Bruk parenteser som et lat alternativ til listeforståelser.
- De sparer minne og støtter
if-filtre og nøstede løkker. - De fungerer godt sammen med
sum,any,allog kjeding. - De kan bare brukes én gang.
Deretter skal De se på hvordan generatorer settes sammen med yield from.
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 «Generatorekspresjoner» gratis?
Ja – hele teksten i «Generatorekspresjoner» 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 «Generatorekspresjoner»?
Skriv kompakte, late pipelines 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 3 av 4.
Hvor lang tid tar leksjonen «Generatorekspresjoner»?
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