Генератор - это обыкновенная функция python. Главное отличие - это то, что данные она возвращает не командой return, а командой yield.
Эта команда и будет генерировать последовательность значений.
И если вызвать такую функцию - она не вернёт объект генератора, не значение. Затем из данного объекта посредством функции next или цикла for удастся получить значения, которые должна была вернуть функция.
Когда генератор вернёт все данные - будет брошен эксепшн типа StopIteration. По сути - генератор это тот же итератор, просто выглядит по-другому.
Ещё важный момент - генератор вернёт данные лишь однажды. И перебрать его результаты можно лишь единожды. Это происходит из-за того, что данные не хранятся в памяти, а генерируются на лету.
Пример:
def animals_generator(): yield 'овца' for animal in ['енот', 'лошадь', 'олень']: yield animal yield 'собака' animals = animals_generator() # # Выведет: # 1: овца # 1: енот # 1: лошадь # 1: олень # 1: собака for animal in animals: print(f'1: {animal}') # Ничего не выведет for animal in animals: print(f'2: {animal}')