Python Academy · Lektion

yield from og delegering

Sammensæt generatorer

Lektion 4 af 413 trin

yield from og delegering er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 4 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.

Problemet, som yield from løser

Når en generator vil levere hver eneste værdi fra en anden itererbar samling, kan du skrive en manuel løkke. yield from gør det samme på én linje.

def manual():
    for x in [1, 2, 3]:
        yield x

print(list(manual()))

Introduktion til yield from

yield from iterable overlader gennemløbet til den itererbare samling og leverer hver af dens værdier efter tur. Det er kortere og tydeligere end en videresendelsesløkke.

def delegate():
    yield from [1, 2, 3]

print(list(delegate()))

Kombination af flere kilder

Du kan kæde flere yield from-udtryk for dovent at sammenkæde sekvenser.

def chained():
    yield from 'ab'
    yield from [1, 2]
    yield from range(2)

print(list(chained()))

Delegering til en anden generator

Den itererbare samling, der delegeres til, kan selv være en generator, så du kan sammensætte generatorer til større generatorer.

def evens(n):
    for i in range(n):
        if i % 2 == 0:
            yield i

def report(n):
    print('evens:')
    yield from evens(n)

print(list(report(6)))

Udfladning af indlejrede lister

En klassisk anvendelse af yield from er rekursiv udfladning: en generator, der delegerer til sig selv for underlister.

def flatten(items):
    for item in items:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

print(list(flatten([1, [2, [3, 4]], 5])))

yield from sammenlignet med en løkke

Begge versioner nedenfor giver det samme resultat. yield from foretrækkes af hensyn til læsbarheden og fordi det også videresender avancerede funktioner som afsendelse af værdier og returresultater.

def with_loop(src):
    for x in src:
        yield x

def with_yield_from(src):
    yield from src

print(list(with_loop(range(3))))
print(list(with_yield_from(range(3))))

Hent en undergenerators returværdi

Når en delegeret generator return-er en værdi, evalueres yield from til denne værdi. Det gør det muligt for undergeneratorer at rapportere et resultat.

def counter(n):
    count = 0
    for i in range(n):
        yield i
        count += 1
    return count

def driver():
    total = yield from counter(3)
    print('subgen yielded', total, 'items')

list(driver())

Opbygning af en databehandlingskæde

Delegering gør det nemt at opdele en databehandlingskæde i navngivne trin og sammensætte dem.

def source():
    yield from range(5)

def only_odd(src):
    for x in src:
        if x % 2 == 1:
            yield x

def pipeline():
    yield from only_odd(source())

print(list(pipeline()))

Delegering til enhver itererbar samling

yield from fungerer med enhver itererbar samling, ikke kun generatorer: lister, tupler, mængder, strenge, ordbogsnøgler og meget mere.

def mixed():
    yield from {1, 2, 3}
    yield from ('a', 'b')

result = list(mixed())
print(sorted(str(x) for x in result))

Sammenfletning af generatorer i rækkefølge

Du kan opbygge en generator, der gennemløber flere kilder sekventielt, hvilket er nyttigt til sammenkædning af datastrømme.

def concat(*iterables):
    for it in iterables:
        yield from it

print(list(concat([1, 2], [3], [4, 5])))

Læsbarhed vinder

Ved dybt indlejrede eller trælignende data holder yield from rekursive generatorer korte og gør deres hensigt tydelig.

def walk(tree):
    yield tree['name']
    for child in tree.get('children', []):
        yield from walk(child)

tree = {'name': 'root', 'children': [
    {'name': 'a'},
    {'name': 'b', 'children': [{'name': 'c'}]}
]}
print(list(walk(tree)))

Hurtigt tjek

Tjek din forståelse af yield from.

Opsummering

Du har lært om yield from og delegering:

  • Det videresender hver værdi fra en indre itererbar samling.
  • Det sammensætter generatorer og muliggør rekursiv udfladning.
  • Det opfanger undergeneratorens returværdi.
  • Det er tydeligere end en manuel videresendelsesløkke.

Næste kursus: samtidighed med tråde og multiprocessing.

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 “yield from og delegering” gratis?

Ja — hele teksten til “yield from og delegering” 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 “yield from og delegering”?

Sammensæt generatorer 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 4 af 4.

Hvor lang tid tager lektionen “yield from og delegering”?

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