yield
— это ключевое слово в Python, которое превращает обычную функцию в генератор. Оно выполняет две ключевые функции:
return
)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 |
---|---|---|
Возвращаемое значение | Генератор | Результат функции |
Состояние функции | Сохраняется | Удаляется |
Количество вызовов | Множественные | Одиночный |
Последующие вызовы | Продолжает выполнение | Начинает с начала |
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
def chain_generators():
yield from [1, 2, 3]
yield from "abc"
for item in chain_generators():
print(item) # 1, 2, 3, 'a', 'b', 'c'
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) # "Готово"
def read_in_chunks(file, chunk_size=1024):
while True:
data = file.read(chunk_size)
if not data:
break
yield data
def infinite_counter(start=0):
n = start
while True:
yield n
n += 1
def processing_pipeline(data):
for item in data:
processed = preprocess(item)
if validate(processed):
yield transform(processed)
Ключевое слово yield
превращает функцию в генератор, позволяя ей возвращать значения по одному, сохраняя состояние между вызовами. Основные преимущества: ленивые вычисления, экономия памяти и удобство работы с потоками данных. yield
поддерживает продвинутые возможности, такие как получение данных через send()
, делегирование генераторов через yield from
и возврат финального значения через return
.