0Pricing
Python Academy · Lekcja

Słowo kluczowe yield

Proszę pisać funkcje generatorowe z użyciem yield, aby tworzyć własne iteratory.

Słowo kluczowe yield 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.

Wprowadzenie

Funkcje generatorowe używają yield do leniwego zwracania sekwencji wartości, wstrzymując wykonywanie między kolejnymi instrukcjami yield.

Czym jest yield?

Funkcja zawierająca yield jest funkcją generatorową. Każde wywołanie next() wznawia jej działanie od ostatniej instrukcji yield.
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

Funkcja generatorowa a zwykła funkcja

Wywołanie funkcji generatorowej zwraca obiekt generatora — nie wykonuje jeszcze żadnego kodu. Kod jest wykonywany podczas iteracji.
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

Nieskończony generator

def naturals(n=0): while True: yield n; n+=1 to nieskończona sekwencja. Należy użyć islice lub 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() przekazuje wykonanie do podgeneratora, przekazując dalej wszystkie wartości. Jest równoważne konstrukcji for x in sub: yield x.
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

Przekazywanie wartości za pomocą send()

gen.send(value) wznawia działanie generatora ORAZ przekazuje wartość, która staje się wynikiem wyrażenia yield.
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))

Stan generatora

Generator zatrzymuje się przy każdej instrukcji yield i zachowuje zmienne lokalne między wywołaniami — jest naturalną korutyną.
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))

Zamykanie generatora

gen.close() zgłasza GeneratorExit wewnątrz generatora. W generatorze należy użyć try/finally do sprzątania zasobów.
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration i return

Instrukcja return value w generatorze ustawia wartość atrybutu value wyjątku StopIteration. Konstrukcja yield from używa jej do odczytania tej wartości.
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)

Generator ciągu Fibonacciego

Generatory doskonale sprawdzają się przy nieskończonych sekwencjach matematycznych: 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)))

Generatory a klasy z __iter__

Generatory są prostsze niż pisanie klasy z __iter__ i __next__. Generatorów należy używać dla prostych sekwencji.
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

Szybkie sprawdzenie

Co robi yield from sub() w funkcji generatorowej?

Podsumowanie

yield wstrzymuje działanie funkcji generatora. Funkcje generatora zwracają obiekt generatora. yield from przekazuje sterowanie podgeneratorom. send() przekazuje wartości do środka. close() uruchamia sprzątanie.

Kontynuuj

Doskonale! Proszę przejść do następnej lekcji, aby pogłębić swoje umiejętności.

Często zadawane pytania

Czy lekcja „Słowo kluczowe yield” jest bezpłatna?

Tak — pełny tekst „Słowo kluczowe yield” 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 „Słowo kluczowe yield”?

Proszę pisać funkcje generatorowe z użyciem yield, aby tworzyć własne iteratory. Ć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 „Słowo kluczowe yield”?

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

  1. Rozumienie listowe
  2. Rozumienie zbiorów i słowników
  3. Wyrażenia generatorowe
  4. Słowo kluczowe yield
← Powrót do Python Academy