yield
для возврата значений, не завершая функцию.yield
.return
для возврата значения и завершения функции.Генератор и обычная функция в Python имеют ряд ключевых отличий, касающихся способа их выполнения, хранения данных и использования памяти. Вот основные различия:
Выполнение:
None
, если явно не возвращает).yield
. Приостанавливает свое выполнение и "замораживает" свое состояние (значения переменных, точку выполнения). Когда вызывается метод next()
(или используется в цикле for
), генератор возобновляет выполнение с места остановки до следующего yield
. Выполнение генератора заканчивается, когда он либо доходит до конца, либо встречает return
, либо выбрасывает исключение.Возврат значений:
return
.yield
. Каждый вызов yield
производит следующее значение в последовательности.Хранение состояния:
Использование памяти:
Примеры:
def square_numbers(n):
result = []
for i in range(n):
result.append(i * i)
return result
numbers = square_numbers(5) # Создается список [0, 1, 4, 9, 16] в памяти
def square_numbers_generator(n):
for i in range(n):
yield i * i
numbers = square_numbers_generator(5) # Не создает список в памяти
for num in numbers: # Значения вычисляются по мере необходимости
print(num)
Когда использовать генераторы: