0Pricing
Python Academy · Урок

Ключевое слово yield

Пишите функции-генераторы с yield для создания пользовательских итераторов.

«Ключевое слово yield» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

Функции-генераторы используют yield, чтобы лениво выдавать последовательность значений, приостанавливая выполнение между операторами yield.

Что такое yield?

Функция с yield является функцией-генератором. Каждый вызов next() продолжает выполнение с места последнего yield.
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

Функция-генератор и обычная функция

Вызов функции-генератора возвращает объект-генератор — код пока НЕ выполняется. Код выполняется по мере итерации.
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

Бесконечный генератор

def naturals(n=0): while True: yield n; n+=1 — это бесконечная последовательность. Используйте её с islice или 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() делегирует выполнение подгенератору, передавая все значения. Это эквивалентно конструкции for x in sub: yield x.
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

Передача значений с помощью send()

gen.send(value) возобновляет генератор AND передаёт значение, которое становится результатом выражения 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))

Состояние генератора

Генератор приостанавливается на каждом yield и сохраняет локальные переменные между вызовами — это естественная сопрограмма.
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))

Закрытие генератора

gen.close() вызывает GeneratorExit внутри генератора. Используйте try/finally внутри генератора для очистки ресурсов.
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration и return

Оператор return value в генераторе задаёт значение атрибута value исключения StopIteration. yield from использует его для получения этого значения.
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)

Генератор Фибоначчи

Генераторы особенно удобны для бесконечных математических последовательностей: 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)))

Генераторы и классы с __iter__

Генераторы проще, чем написание класса с __iter__ и __next__. Используйте генераторы для простых последовательностей.
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

Быстрая проверка

Что делает yield from sub() в функции-генераторе?

Повторение

yield приостанавливает функцию-генератор. Функции-генераторы возвращают объект-генератор. yield from делегирует выполнение подгенераторам. send() передаёт значения внутрь. close() запускает очистку.

Продолжить

Отлично! Перейдите к следующему уроку, чтобы углубить свои навыки.

Часто задаваемые вопросы

Урок «Ключевое слово yield» бесплатный?

Да — полный текст урока «Ключевое слово yield» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ключевое слово yield»?

Пишите функции-генераторы с yield для создания пользовательских итераторов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Ключевое слово yield»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Генераторы списков
  2. Генераторы множеств и словарей
  3. Генерирующие выражения
  4. Ключевое слово yield
← Назад к Python Academy