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)
                Когда использовать генераторы: