Python Academy · Lektion

Generatorekspressioner

Skriv kompakte, dovne pipelines

Lektion 3 af 413 trin

Generatorekspressioner er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 3 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.

Fra listeforståelse til generatorudtryk

Et generatorudtryk ligner en listeforståelse, men bruger parenteser i stedet for kantede parenteser. Det producerer værdier dovent i stedet for at opbygge en hel 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))

Forskel i hukommelsesforbrug

En listeforståelse allokerer hvert element på forhånd. Et generatorudtryk optager næsten ingen plads, før du beder om værdier. Sammenlign deres størrelser.

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

Gennemløb af et generatorudtryk

Du gennemløber et generatorudtryk ligesom enhver anden iterator: med en for-løkke, next() eller ved at give det videre til en funktion.

gen = (c.upper() for c in 'hello')
for ch in gen:
    print(ch)

Filtrering med if

Tilføj en if-betingelse for kun at beholde matchende elementer, præcis som i en listeforståelse.

evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))

Direkte overførsel til funktioner

Når et generatorudtryk er det eneste argument til en funktion, kan du udelade de ekstra parenteser. Det giver en enkel skrivemåde og undgår at opbygge 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åmindelse om, at de kun kan bruges én gang

Et generatorudtryk er opbrugt efter én gennemløbning, ligesom en generatorfunktion. Den anden gennemløbning giver ingen værdier.

gen = (x for x in range(3))
print(list(gen))
print(list(gen))

Kædning af udtryk

Du kan føre ét generatorudtryk ind i et andet for at opbygge en doven databehandlingskæde. Intet beregnes, før den sidste forbruger henter værdier.

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

Generatorudtryk er særligt nyttige sammen med any() og all(), fordi de kan afbryde tidligt og stoppe, så snart svaret er kendt.

words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))

Indlejrede løkker

Ligesom listeforståelser understøtter generatorudtryk flere for-betingelser, som læses fra venstre mod højre.

pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))

Eksempel på en doven databehandlingskæde

Her er en lille databehandlingskæde til tekstbehandling. Hvert trin er dovent, så en meget stor fil kan behandles som en datastrøm uden at blive indlæst i sin helhed.

lines = ['  alpha ', '', '  beta', 'gamma  ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))

Hvornår skal du vælge hvad?

Brug en listeforståelse, når du skal bruge dataene flere gange eller har brug for indeksering. Brug et generatorudtryk til streaming gennem data én gang eller til store datamængder.

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)

Hurtigt tjek

Tjek din forståelse af generatorudtryk.

Opsummering

Du har lært om generatorudtryk:

  • Brug parenteser som et dovent alternativ til listeforståelser.
  • De sparer hukommelse og understøtter if-filtre og indlejrede løkker.
  • De fungerer godt sammen med sum, any, all og kædning.
  • De kan kun bruges én gang.

Næste emne er sammensætning af generatorer med yield from.

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 “Generatorekspressioner” gratis?

Ja — hele teksten til “Generatorekspressioner” 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 “Generatorekspressioner”?

Skriv kompakte, dovne pipelines 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 3 af 4.

Hvor lang tid tager lektionen “Generatorekspressioner”?

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