Python Academy · Les

Generatorfuncties

Produceer waarden lui met yield

Les 2 van 413 stappen

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:

  • yield onderbreekt 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.

Gratis beginnen

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

  1. Het iteratorprotocol
  2. Generatorfuncties
  3. Generatorexpressies
  4. yield from en delegatie
← Terug naar Python Academy