Generatorexpressioner
Skriv kompakta lata pipelines
Generatorexpressioner är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.
Från list comprehension till generatoruttryck
Ett generatoruttryck ser ut som en list comprehension men använder parenteser i stället för hakparenteser. Det producerar värden på begäran i stället för att bygga en hel lista.
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))Minnesskillnad
En list comprehension allokerar alla element direkt. Ett generatoruttryck innehåller nästan ingenting förrän du efterfrågar värden. Jämför deras storlek.
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))Iterera över ett generatoruttryck
Du förbrukar ett generatoruttryck som vilken iterator som helst: med en for-loop, next() eller genom att skicka det till en funktion.
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)Filtrering med if
Lägg till en if-sats för att bara behålla matchande objekt, precis som i en comprehension.
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))Skicka direkt till funktioner
När ett generatoruttryck är det enda argumentet till en funktion kan du utelämna de extra parenteserna. Det ger renare kod och undviker att en tillfällig lista skapas.
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 att de bara kan användas en gång
Ett generatoruttryck är uttömt efter en genomgång, precis som en generatorfunktion. Vid den andra iterationen ger det inga värden.
gen = (x for x in range(3))
print(list(gen))
print(list(gen))Kedja uttryck
Du kan mata ett generatoruttryck till ett annat för att bygga en lat pipeline. Inget beräknas förrän den slutliga konsumenten hämtar värden.
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() och all()
Generatoruttryck passar utmärkt med any() och all() eftersom de kan avbryta tidigt, så snart svaret är känt.
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))Kapslade loopar
Precis som comprehensions stöder generatoruttryck flera for-satser, som läses från vänster till höger.
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))Exempel på en lat pipeline
Här är en liten pipeline för textbearbetning. Varje steg är lat, så en mycket stor fil kan strömmas utan att läsas in helt i minnet.
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))När ska du välja vilket
Använd en list comprehension när du behöver använda data flera gånger eller behöver indexering. Använd ett generatoruttryck för strömning i en enda genomgång eller för stora 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)Snabbtest
Testa din förståelse av generatoruttryck.
Sammanfattning
Du har lärt dig om generatoruttryck:
- Använd parenteser som ett lat alternativ till list comprehensions.
- De sparar minne och stöder
if-filter och kapslade loopar. - De passar bra ihop med
sum,any,alloch kedjning. - De kan bara användas en gång.
Härnäst: att komponera generatorer med yield from.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 76
- Lektioner
- 320
Vanliga frågor
Är lektionen ”Generatorexpressioner” gratis?
Ja – hela texten till ”Generatorexpressioner” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Generatorexpressioner”?
Skriv kompakta lata pipelines Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Python Academy?
Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Generatorexpressioner”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Python Academy-lektionen?
Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Iteratorprotokollet
- Generatorfunktioner
- Generatorexpressioner
- yield from och delegering