Подгенератор — это генератор, который делегирует часть своей работы другому генератору с помощью синтаксиса yield from
. Это мощная возможность Python, появившаяся в PEP 380.
Подгенератор позволяет:
def delegator_gen():
# Основной генератор
yield from subgenerator() # Делегирование подгенератору
yield 'local value'
def subgenerator():
# Подгенератор
yield 1
yield 2
gen = delegator_gen()
print(list(gen)) # [1, 2, 'local value']
Двусторонняя коммуникация:
yield from
Автоматическая обработка StopIteration:
Вложенность:
def flatten(nested):
for sublist in nested:
yield from sublist # Делегирование для каждого подсписка
nested = [[1, 2], [3, 4], [5]]
print(list(flatten(nested))) # [1, 2, 3, 4, 5]
def process_pipeline(data):
# Первый этап обработки
cleaned = (x for x in data if x is not None)
# Делегирование второму этапу
yield from transform_data(cleaned)
def transform_data(items):
for item in items:
yield item * 2
data = [1, None, 2, 3]
print(list(process_pipeline(data))) # [2, 4, 6]
def accumulator():
total = 0
while True:
value = yield
if value is None:
return total
total += value
def gatherer():
while True:
# Получаем результат работы подгенератора
res = yield from accumulator()
yield f'Total: {res}'
gen = gatherer()
next(gen) # Инициализация
gen.send(10) # Отправляем значения
gen.send(20)
print(gen.send(None)) # 'Total: 30'
Когда выполняется yield from
:
send()
, throw()
, close()
передаются подгенераторуПодгенератор — это генератор, которому делегируется часть работы через yield from
. Основные преимущества:
Использование подгенераторов особенно полезно при обработке древовидных структур, построении конвейеров данных и реализации сложных конечных автоматов.