Зачем нужен yield вместо return в функции

Ключевое слово `yield` используется для создания генератора, который является разновидностью итератора. В отличие от обычных функций, которые возвращают значения с помощью `return` и завершают своё выполнение, функции с `yield` возвращают генератор, который при каждом вызове продолжает выполнение функции с того места, где было сделано последнее `yield`.

Преимущества использования `yield` вместо `return`:
1. Экономия памяти: Генераторы вычисляют значения по требованию (lazy evaluation), что позволяет им обрабатывать даже очень большие последовательности данных, не загружая всю последовательность в память. Это особенно полезно для обработки больших файлов или потоков данных.

2. Удобство в управлении состоянием: Функции с `yield` удобны, когда нужно управлять сложным состоянием внутри функции. Функция может "замораживать" своё состояние между вызовами и продолжать выполнение с того места, где она остановилась.

3. Составление итераторов: Создание итератора с помощью `yield` значительно упрощается по сравнению с классами итераторов, которые требуют определения методов `__iter__()` и `__next__()`.

Предположим, нам нужно итерировать через числа Фибоначчи. Вместо создания списка всех чисел, что может быть неэффективным с точки зрения памяти, можно использовать генератор:

```python
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# Создание генератора для первых 10 чисел Фибоначчи
fib_gen = fibonacci(10)

# Итерация по генератору
for num in fib_gen:
    print(num)
```

В чём разница между ними?

  • `return` возвращает значение и завершает выполнение функции.
  • `yield` возвращает значение и "приостанавливает" выполнение функции, позволяя продолжить с того же места при следующем вызове.

`yield` используется для создания генераторов, которые помогают экономить память и упрощать код, особенно при работе с большими данными. Это как "пауза" в фильме, после которой можно продолжить просмотр с того же момента.

May 22, 2024, easyoffer