Вызов функции генератора, как в testFunc(1)
, просто создает экземпляр генератора; он не управляет телом кода. Генераторы являются итераторами, поэтому вы можете передать их в next()
. В случае генераторов действие его __next__()
по существу запускается до следующего оператора yield
и возвращает полученное значение. Таким образом, вы можете делать такие вещи, как:
>>> gen = testFunc(1)
>>> next(gen)
Will this print?
1
или, как отметили другие, вы можете перебрать его (хотя это не обязательно, если вы хотите просто дать одно значение).
Когда вы определяете генератор, вы можете почти думать о вызове генератора как создании экземпляра какого-либо класса, который реализует очень конкретный конечный автомат, который работает как итератор. Чтобы быть ясным, на самом деле это , как он работает, но он может быть написан эквивалентно таким образом. Однако генераторы - гораздо более элегантный способ сделать это в большинстве случаев.