yield from i delegowanie
Łącz generatory
yield from i delegowanie to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Problem rozwiązywany przez yield from
Gdy jeden generator ma zwracać każdą wartość z innego obiektu iterowalnego, można napisać ręczną pętlę. yield from robi to samo w jednym wierszu.
def manual():
for x in [1, 2, 3]:
yield x
print(list(manual()))Wprowadzenie do yield from
yield from iterable przekazuje sterowanie temu obiektowi iterowalnemu i kolejno zwraca każdą z jego wartości. Jest krótsze i czytelniejsze niż pętla przekazująca wartości.
def delegate():
yield from [1, 2, 3]
print(list(delegate()))Łączenie wielu źródeł
Można połączyć kilka instrukcji yield from, aby leniwie skonkatenować sekwencje.
def chained():
yield from 'ab'
yield from [1, 2]
yield from range(2)
print(list(chained()))Delegowanie do innego generatora
Delegowany obiekt iterowalny może być sam generatorem, co pozwala komponować większe generatory z mniejszych.
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)))Spłaszczanie zagnieżdżonych list
Klasycznym zastosowaniem yield from jest rekurencyjne spłaszczanie: generator deleguje działanie samemu sobie dla podlist.
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 a pętla
Obie poniższe wersje generują ten sam wynik. yield from jest preferowane ze względu na czytelność, a także dlatego, że przekazuje zaawansowane funkcje, takie jak wysyłanie wartości i wyników zwracanych przez generator.
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))))Pobieranie wyniku podgeneratora
Gdy delegowany generator zwraca wartość za pomocą return, wyrażenie yield from przyjmuje tę wartość. Dzięki temu podgeneratory mogą przekazywać wynik.
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())Budowanie potoku
Delegowanie ułatwia podzielenie potoku na nazwane etapy i komponowanie ich.
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()))Delegowanie do dowolnego obiektu iterowalnego
yield from działa z każdym obiektem iterowalnym, nie tylko z generatorami: z listami, krotkami, zbiorami, napisami, kluczami słowników i innymi obiektami.
def mixed():
yield from {1, 2, 3}
yield from ('a', 'b')
result = list(mixed())
print(sorted(str(x) for x in result))Łączenie generatorów w kolejności
Można utworzyć generator, który kolejno przechodzi przez kilka źródeł, co przydaje się do łączenia strumieni.
def concat(*iterables):
for it in iterables:
yield from it
print(list(concat([1, 2], [3], [4, 5])))Korzyści z czytelności
W przypadku głęboko zagnieżdżonych danych lub struktur drzewiastych yield from pozwala zachować zwięzłość generatorów rekurencyjnych i jasno wyraża ich przeznaczenie.
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)))Szybkie sprawdzenie
Sprawdź swoją znajomość yield from.
Podsumowanie
Poznałeś(-aś) yield from i delegowanie:
- Przekazuje każdą wartość z wewnętrznego obiektu iterowalnego.
- Umożliwia komponowanie generatorów i rekurencyjne spłaszczanie danych.
- Pobiera wartość zwracaną przez podgenerator.
- Jest czytelniejsze niż ręczna pętla przekazująca wartości.
Następny kurs: współbieżność z użyciem wątków i procesów.
Często zadawane pytania
Czy lekcja „yield from i delegowanie” jest bezpłatna?
Tak — pełny tekst „yield from i delegowanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „yield from i delegowanie”?
Łącz generatory Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „yield from i delegowanie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Protokół iteratora
- Funkcje generatorów
- Wyrażenia generatorowe
- yield from i delegowanie