Комментарии (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. Оно позволяет создавать функции, которые возвращают значения по одному, экономя память и повышая производительность при работе с большими данными.