Что делает yieldpython-78

yield — это ключевое слово в Python, которое превращает обычную функцию в генератор. Оно выполняет две ключевые функции:

  1. Возвращает значение вызывающему коду (как return)
  2. Приостанавливает выполнение функции, сохраняя все её локальные состояния

Основные особенности yield

  1. Превращает функцию в генератор — функция с yield возвращает генератор при вызове
  2. Сохраняет состояние — при повторном вызове выполнение продолжается с места остановки
  3. Ленивые вычисления — значения генерируются по требованию
  4. Потоковая обработка — позволяет работать с данными по частям

Как работает yield шаг за шагом

def simple_generator():
    print("Начало выполнения")
    yield 1
    print("Продолжение выполнения")
    yield 2
    print("Завершение выполнения")

gen = simple_generator()  # Функция не выполняется, возвращается генератор

print(next(gen))  # Начало выполнения \n 1
print(next(gen))  # Продолжение выполнения \n 2
print(next(gen))  # Завершение выполнения \n StopIteration

Отличие yield от return

Характеристика yield return
Возвращаемое значение Генератор Результат функции
Состояние функции Сохраняется Удаляется
Количество вызовов Множественные Одиночный
Последующие вызовы Продолжает выполнение Начинает с начала

Продвинутые возможности yield

1. Отправка данных в генератор )

def interactive_gen():
    print("Старт")
    while True:
        value = yield  # Получаем значение извне
        if value == "стоп":
            break
        print(f"Получено: {value}")

gen = interactive_gen()
next(gen)  # Инициализация (доходим до первого yield)
gen.send("привет")  # Получено: привет
gen.send(42)        # Получено: 42
gen.send("стоп")    # StopIteration

2. Делегирование генераторов

def chain_generators():
    yield from [1, 2, 3]
    yield from "abc"

for item in chain_generators():
    print(item)  # 1, 2, 3, 'a', 'b', 'c'

3. Возврат значения из генератора

def gen_with_return():
    yield 1
    yield 2
    return "Готово"

g = gen_with_return()
print(next(g))  # 1
print(next(g))  # 2
try:
    next(g)
except StopIteration as e:
    print(e.value)  # "Готово"

Практическое применение yield

  1. Обработка больших файлов
def read_in_chunks(file, chunk_size=1024):
    while True:
        data = file.read(chunk_size)
        if not data:
            break
        yield data
  1. Генерация бесконечных последовательностей
def infinite_counter(start=0):
    n = start
    while True:
        yield n
        n += 1
  1. Реализация конвейеров обработки данных
def processing_pipeline(data):
    for item in data:
        processed = preprocess(item)
        if validate(processed):
            yield transform(processed)

Резюмируем

Ключевое слово yield превращает функцию в генератор, позволяя ей возвращать значения по одному, сохраняя состояние между вызовами. Основные преимущества: ленивые вычисления, экономия памяти и удобство работы с потоками данных. yield поддерживает продвинутые возможности, такие как получение данных через send(), делегирование генераторов через yield from и возврат финального значения через return.