← Назад к вопросам

Какое ключевое слово создает генератор?

1.3 Junior🔥 111 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какое ключевое слово создает генератор

Ответ: yield

Ключевое слово yield превращает обычную функцию в генератор.

Основы

# Обычная функция
def regular_function():
    return [1, 2, 3, 4, 5]

# Генератор (с yield)
def generator_function():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5

# Использование
result = generator_function()
print(type(result))  # <class 'generator'>

# Итерация
for value in result:
    print(value)  # Выведет 1, 2, 3, 4, 5

Отличие от return

# return - возвращает всё сразу
def with_return(n):
    items = []
    for i in range(n):
        items.append(i * 2)
    return items  # Возвращает весь список в памяти

result = with_return(5)  # [0, 2, 4, 6, 8] - весь список в памяти

# yield - возвращает по одному (ленивый подход)
def with_yield(n):
    for i in range(n):
        yield i * 2  # Возвращает один элемент, останавливает функцию

result = with_yield(5)
for item in result:
    print(item)  # 0, 2, 4, 6, 8 - элементы создаются по мере необходимости

Практические примеры

1. Чтение больших файлов:

def read_large_file(file_path, chunk_size=1024):
    with open(file_path, 'rb') as file:
        while True:
            chunk = file.read(chunk_size)
            if not chunk:
                break
            yield chunk

# Использование (без загрузки файла в память)
for chunk in read_large_file('large_file.txt'):
    process_chunk(chunk)

2. Генерирование данных для обработки:

def generate_data_batches(data, batch_size=1000):
    for i in range(0, len(data), batch_size):
        batch = data[i:i + batch_size]
        yield batch

# Использование
data = range(10000)
for batch in generate_data_batches(data, batch_size=100):
    process_batch(batch)

3. Бесконечные последовательности:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# Использование
fib = fibonacci()
for _ in range(10):
    print(next(fib))  # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

4. Трансформация потока данных:

def filter_events(events_stream):
    for event in events_stream:
        if event['type'] == 'purchase':
            yield event['amount']

def transform_amounts(amounts):
    for amount in amounts:
        yield amount * 1.1  # Добавляем 10%

# Использование (lazy evaluation)
events = [
    {'type': 'purchase', 'amount': 100},
    {'type': 'view', 'amount': 0},
    {'type': 'purchase', 'amount': 200}
]

amounts = filter_events(events)
increased = transform_amounts(amounts)

for result in increased:
    print(result)  # 110, 220

Преимущества yield

  • Память: только один элемент в памяти (не весь список)
  • Скорость: сразу начинает выдавать первый элемент
  • Масштабируемость: обработка 1GB файла без проблем
  • Лень: вычисления только когда нужны

Сравнение памяти:

import sys

# С return
def range_return(n):
    return list(range(n))

# С yield
def range_yield(n):
    for i in range(n):
        yield i

# Проверка размера
list_result = range_return(1000000)
print(f"List size: {sys.getsizeof(list_result)} bytes")  # ~8MB

gen_result = range_yield(1000000)
print(f"Generator size: {sys.getsizeof(gen_result)} bytes")  # ~120 bytes

Итоги

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