Generatorfuncties
Produceer waarden lui met yield
Generatorfuncties is een gratis Python Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Wat is een generator?
Een generatorfunctie ziet eruit als een normale functie, maar gebruikt yield in plaats van (of naast) return. Als je de functie aanroept, wordt de inhoud ervan niet uitgevoerd; de aanroep retourneert een generatorobject, dat een iterator is.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))yield onderbreekt de uitvoering
Elke keer dat je next() aanroept, wordt de functie uitgevoerd totdat deze een yield tegenkomt, de betreffende waarde retourneert en zijn toestand bevriest. De volgende aanroep gaat verder direct na de yield.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))Een generator doorlopen
Omdat een generator een iterator is, stuurt een for-lus deze automatisch aan en stopt de lus wanneer de functie eindigt (intern wordt dan StopIteration opgegooid).
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)Luie evaluatie
Generators zijn lui: waarden worden alleen geproduceerd wanneer daarom wordt gevraagd. Daardoor kun je zeer grote of oneindige reeksen modelleren zonder veel geheugen te gebruiken.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))Toestand tussen yield-aanroepen
Lokale variabelen behouden hun waarden tussen yield-punten. Een generator onthoudt vanzelf waar deze is gebleven, zonder dat je handmatig een index hoeft bij te houden.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])Generators versus een lijst opbouwen
Een normale functie bouwt de volledige lijst in één keer op en retourneert deze. Een generator levert items op aanvraag. Gebruik een generator wanneer de reeks groot is of wanneer je mogelijk vroegtijdig stopt.
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)))Vroegtijdig stoppen
Omdat waarden lui worden geproduceerd, kun je een lus verlaten en berekent de generator de rest eenvoudigweg nooit.
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 in een generator
Een kale return in een generator beëindigt deze eenvoudigweg (waarbij StopIteration wordt opgegooid). Elke waarde die je retourneert, wordt de value-eigenschap van de uitzondering; de meeste lussen negeren die.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))Generators kun je maar één keer gebruiken
Net als alle iterators wordt een generator één keer verbruikt. Na het einde levert deze niets meer op. Roep de functie opnieuw aan om een nieuwe generator te krijgen.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))Filteren met generators
Generators maken overzichtelijke gegevenspijplijnen mogelijk. Hier leveren we alleen de even getallen, één voor één.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))Generators aan elkaar koppelen
Een generator kan een andere generator verbruiken, zodat je een pijplijn met meerdere stappen opbouwt waarin elke stap lui is.
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))))Korte controle
Controleer of je generatorfuncties begrijpt.
Samenvatting
Je hebt generatorfuncties geleerd:
yieldonderbreekt en hervat de uitvoering en behoudt de lokale toestand.- Als je de functie aanroept, krijg je een lui generatorobject.
- Ze zijn zuinig met geheugen en geschikt voor pijplijnen en oneindige gegevensstromen.
- Je kunt ze maar één keer gebruiken, net als elke iterator.
Vervolgens bekijk je de nog compactere generator-expressies.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “Generatorfuncties” gratis?
Ja — de volledige tekst van “Generatorfuncties” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “Generatorfuncties”?
Produceer waarden lui met yield Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Generatorfuncties”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Python Academy?
Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het iteratorprotocol
- Generatorfuncties
- Generatorexpressies
- yield from en delegatie