Ключевое слово
yield позволяет создавать генераторы — функции, которые могут возвращать значения одно за другим, сохраняя свое состояние для следующего вызова. Это полезно для работы с большими наборами данных, так как не нужно загружать все данные в память сразу.Когда функция с
yield вызывается, она возвращает объект-генератор. Этот объект можно итерировать (перебирать) для получения значений, которые функция «производит» по мере необходимости.Предположим, у нас есть функция, которая возвращает числа от 1 до 3:
def simple_generator():
yield 1
yield 2
yield 3
# Получаем генератор
gen = simple_generator()
# Итерируем генератор
for value in gen:
print(value)
# Результат:
# 1
# 2
# 3
Как это работает:
1. Функция
simple_generator использует yield для возврата значений.2. Каждый вызов
yield приостанавливает выполнение функции и возвращает значение.3. На следующий вызов итерации выполнение функции продолжается с места, где оно было приостановлено последним
yield.А теперь представьте, что вам нужно обработать очень большой список чисел, но вы хотите сделать это постепенно, по одному числу за раз. В этом случае генератор с
yield идеально подходит.Например, для фильтрации четных чисел:
def get_even_numbers(numbers):
for number in numbers:
if number % 2 == 0:
yield number
big_list = range(1000000) # Большой диапазон чисел
# Используем генератор для получения четных чисел
even_numbers = get_even_numbers(big_list)
# Печатаем первые 10 четных чисел
for _ in range(10):
print(next(even_numbers))
# Результат:
# 0
# 2
# 4
# 6
# 8
# 10
# 12
# 14
# 16
# 18
Преимущества использования
yield:1. Экономия памяти. Генератор не загружает все данные в память сразу, а генерирует элементы по мере необходимости.
2. Упрощение кода. Использование
yield упрощает написание функций, которые должны постепенно возвращать результаты.3. Меньше кода для обработки больших наборов данных. Генераторы позволяют легко работать с большими данными без необходимости вручную управлять промежуточными структурами данных.
#простымисловами