Python Academy · Lektion

Nyckelordet yield

Skriv generatorfunktioner med yield för egna iteratorer.

Lektion 4 av 414 steg

Nyckelordet yield är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 4 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.

Introduktion

Generatorfunktioner använder yield för att producera en sekvens av värden på ett lat sätt och pausar körningen mellan varje yield.

Vad är yield?

En funktion med yield är en generatorfunktion. Varje anrop till next() fortsätter från den senaste yield.
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

Generatorfunktion kontra vanlig funktion

När en generatorfunktion anropas returneras ett generatorobjekt – ingen kod körs ännu. Koden körs medan ni itererar.
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

Oändlig generator

def naturals(n=0): while True: yield n; n+=1 är en oändlig sekvens. Använd den med islice eller break.
def naturals(n=0):
    while True:
        yield n
        n += 1
import itertools
print(list(itertools.islice(naturals(), 5)))

yield from

yield from sub_gen() delegerar till en undergenerator och vidarebefordrar alla värden. Det motsvarar for x in sub: yield x.
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

Skicka värden med send()

gen.send(value) återupptar generatorn OCH skickar ett värde som blir resultatet av yield-uttrycket.
def accumulator():
    total = 0
    while True:
        n = yield total
        if n is None: break
        total += n
g = accumulator()
next(g)  # prime
print(g.send(10))
print(g.send(5))

Generatorns tillstånd

En generator pausar vid varje yield och behåller sina lokala variabler mellan anrop – en naturlig korutin.
def stateful():
    seen = set()
    while True:
        item = yield
        seen.add(item)
        yield len(seen)
g = stateful()
next(g); g.send('a'); print(next(g)); g.send('b'); print(next(g))

Stäng en generator

gen.close() kastar GeneratorExit inuti generatorn. Använd try/finally inuti generatorn för rensning.
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration och return

return value i en generator anger attributet value i undantaget StopIteration. yield from använder det för att hämta värdet.
def gen_with_return():
    yield 1
    yield 2
    return 'done'
g = gen_with_return()
try:
    while True: print(next(g))
except StopIteration as e:
    print('returned:', e.value)

Fibonacci-generator

Generatorer är utmärkta för oändliga matematiska följder: yield a; a, b = b, a+b
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
import itertools
print(list(itertools.islice(fibonacci(), 10)))

Generatorer kontra klasser med __iter__

Generatorer är enklare än att skriva en klass med __iter__ och __next__. Använd generatorer för enkla sekvenser.
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

Snabbtest

Vad gör yield from sub() i en generatorfunktion?

Sammanfattning

yield pausar en generatorfunktion. Generatorfunktioner returnerar ett generatorobjekt. yield from delegerar till undergeneratorer. send() skickar in värden. close() utlöser rensning.

Fortsätt

Utmärkt! Fortsätt till nästa lektion för att fördjupa era kunskaper.
Gratis att börja

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 ”Nyckelordet yield” gratis?

Ja – hela texten till ”Nyckelordet yield” 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 ”Nyckelordet yield”?

Skriv generatorfunktioner med yield för egna iteratorer. 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 4 av 4.

Hur lång tid tar lektionen ”Nyckelordet yield”?

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

  1. List comprehensions
  2. Set- och dict comprehensions
  3. Generatoruttryck
  4. Nyckelordet yield
← Tillbaka till Python Academy