yield from und Delegation
Generatoren zusammensetzen
yield from und Delegation ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem, das yield from löst
Wenn ein Generator alle Werte eines anderen Iterables liefern soll, können Sie eine manuelle Schleife schreiben. yield from erledigt dasselbe in einer Zeile.
def manual():
for x in [1, 2, 3]:
yield x
print(list(manual()))yield from kennenlernen
yield from iterable delegiert an dieses Iterable und liefert jeden seiner Werte der Reihe nach. Das ist kürzer und übersichtlicher als eine Weiterleitungsschleife.
def delegate():
yield from [1, 2, 3]
print(list(delegate()))Mehrere Quellen kombinieren
Sie können mehrere yield from-Anweisungen verketten, um Folgen verzögert zusammenzuführen.
def chained():
yield from 'ab'
yield from [1, 2]
yield from range(2)
print(list(chained()))An einen anderen Generator delegieren
Das delegierte Iterable kann selbst ein Generator sein, sodass Sie Generatoren zu größeren Generatoren zusammensetzen können.
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)))Verschachtelte Listen abflachen
Eine klassische Verwendung von yield from ist das rekursive Abflachen: ein Generator, der für Unterlisten an sich selbst delegiert.
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 im Vergleich zu einer Schleife
Beide unten gezeigten Varianten erzeugen dieselbe Ausgabe. yield from wird wegen der besseren Lesbarkeit bevorzugt und weil es auch fortgeschrittene Funktionen wie das Senden von Werten und Rückgabewerten weiterleitet.
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))))Den Rückgabewert eines Untergenerators erfassen
Wenn ein delegierter Generator mit return einen Wert zurückgibt, wird yield from zu diesem Wert ausgewertet. So können Untergeneratoren ein Ergebnis zurückmelden.
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())Eine Pipeline erstellen
Durch Delegation lässt sich eine Pipeline einfach in benannte Stufen aufteilen und zusammensetzen.
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()))An jedes Iterable delegieren
yield from funktioniert mit jedem Iterable, nicht nur mit Generatoren: Listen, Tupeln, Mengen, Zeichenketten, Dictionary-Schlüsseln und mehr.
def mixed():
yield from {1, 2, 3}
yield from ('a', 'b')
result = list(mixed())
print(sorted(str(x) for x in result))Generatoren in der richtigen Reihenfolge zusammenführen
Sie können einen Generator erstellen, der mehrere Quellen nacheinander durchläuft. Das ist nützlich, um Datenströme zusammenzuführen.
def concat(*iterables):
for it in iterables:
yield from it
print(list(concat([1, 2], [3], [4, 5])))Bessere Lesbarkeit
Bei tief verschachtelten oder baumartigen Daten hält yield from rekursive Generatoren kurz und macht ihre Absicht deutlich.
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)))Kurzer Test
Testen Sie Ihr Verständnis von yield from.
Zusammenfassung
Sie haben yield from und Delegation kennengelernt:
- Es leitet jeden Wert eines inneren Iterables weiter.
- Es setzt Generatoren zusammen und ermöglicht rekursives Abflachen.
- Es erfasst den Rückgabewert des Untergenerators.
- Es ist übersichtlicher als eine manuelle Weiterleitungsschleife.
Nächster Kurs: Nebenläufigkeit mit threading und multiprocessing.
Häufig gestellte Fragen
Ist die Lektion „yield from und Delegation“ kostenlos?
Ja — der vollständige Text von „yield from und Delegation“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „yield from und Delegation“?
Generatoren zusammensetzen Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „yield from und Delegation“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das Iterator-Protokoll
- Generatorfunktionen
- Generatorausdrücke
- yield from und Delegation