Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Генераторы в Python: ключевые особенности
Генераторы — это один из самых мощных инструментов Python, который я активно использую в работе с данными. Это функции, которые возвращают итератор через ключевое слово yield вместо обычного return.
Основные характеристики
Ленивое вычисление (Lazy Evaluation) Генератор не вычисляет все значения сразу, а генерирует их по требованию. Это критично при работе с большими датасетами — экономит память:
# Обычная функция — вся память сразу
def create_numbers(n):
result = []
for i in range(n):
result.append(i * 2)
return result
# Генератор — по одному значению
def generate_numbers(n):
for i in range(n):
yield i * 2
# Сравнение памяти
import sys
normal = create_numbers(1000000)
gen = generate_numbers(1000000)
print(f"List: {sys.getsizeof(normal)} bytes") # ~8MB
print(f"Generator: {sys.getsizeof(gen)} bytes") # ~128 bytes
Состояние между вызовами
Генератор сохраняет состояние между итерациями. Когда вызываешь next(), выполнение продолжается ровно с того места, где остановилась предыдущая итерация:
def count_up(max_val):
n = 0
while n < max_val:
print(f"Вычисляю: {n}")
yield n
n += 1
gen = count_up(3)
print(next(gen)) # Вычисляю: 0 → 0
print(next(gen)) # Вычисляю: 1 → 1
# Состояние n=1 сохранилось между вызовами
Двусторонняя коммуникация
С помощью метода send() можно передавать значения в генератор:
def process_data():
while True:
value = yield
if value is not None:
print(f"Получил: {value}")
gen = process_data()
next(gen) # Инициализация
gen.send(42) # Передача значения в генератор
Встроенные методы
send(value)— отправить значение в генераторthrow(exception)— выбросить исключение в генераторclose()— остановить генератор
Практическое применение в DS
В моей работе генераторы помогают при:
- Обработке больших файлов — читаю CSV построчно:
def read_large_csv(filename, chunk_size=1000):
with open(filename) as f:
chunk = []
for line in f:
chunk.append(line)
if len(chunk) == chunk_size:
yield chunk
chunk = []
if chunk:
yield chunk
- Батчировании данных для обучения моделей
- Pipeline обработки без загрузки всех данных в RAM
Отличие от обычных функций
Генератор возвращает объект-итератор, а не список. Он работает ровно один раз по элементам — нельзя перебрать дважды без пересоздания.
Это фундаментальный инструмент, который отличает опытного Python-разработчика от новичка, особенно в контексте работы с big data.