Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Генераторы в Python
Генератор — это специальный тип итератора, который создаётся с помощью ключевого слова yield. В отличие от обычных функций, генератор не выполняет всю работу сразу, а возвращает значения по одному, сохраняя своё состояние между вызовами.
Базовый пример
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for num in fibonacci(10):
print(num) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Почему генераторы полезны
Ленивые вычисления — генератор не хранит все значения в памяти одновременно. Это критично при работе с большими данными:
def read_large_file(filepath):
with open(filepath, 'r') as f:
for line in f:
yield line.strip()
for line in read_large_file('huge_log.txt'):
if 'ERROR' in line:
print(line)
Generator Expression
Аналог list comprehension, но ленивый:
squares_list = [x**2 for x in range(1_000_000)] # ~8 МБ RAM
squares_gen = (x**2 for x in range(1_000_000)) # ~120 байт RAM
print(sum(squares_gen))
Конвейер обработки данных
def parse_logs(lines):
for line in lines:
yield line.split('|')
def filter_errors(records):
for record in records:
if record[1].strip() == 'ERROR':
yield record
lines = read_large_file('app.log')
parsed = parse_logs(lines)
errors = filter_errors(parsed)
for error in errors:
print(error[2].strip())
send() и двусторонняя коммуникация
def accumulator():
total = 0
while True:
value = yield total
if value is not None:
total += value
acc = accumulator()
next(acc)
print(acc.send(10)) # 10
print(acc.send(20)) # 30
Когда использовать
- Большие файлы — построчная обработка без загрузки в RAM
- Бесконечные последовательности — числа Фибоначчи, потоки данных
- Конвейеры — цепочки трансформаций данных
- Экономия памяти — когда не нужен весь список сразу
Генераторы — один из самых мощных инструментов Python для работы с данными. Они лежат в основе asyncio, itertools и многих библиотек.