G = gen()
В этой строке создается объект генератора
G, но код внутри функции gen() не начинает выполняться, пока не будет вызван next(G).2. Первый вызов
next(G):
print(next(G)) # 0
Когда вы вызываете
next(G) в первый раз, генератор начинает выполнение с начала функции gen(). Внутри функции запускается цикл for и выполняется первая итерация, где i становится равным 0. Затем происходит yield i, что означает, что значение 0 возвращается, и генератор приостанавливается. Значение 0 выводится на экран.3. Второй вызов
next(G):
print(next(G)) # None 1
Теперь, когда вы вызываете
next(G) во второй раз, генератор продолжает выполнение с той точки, где он был приостановлен (после yield). В этот момент выполнение доходит до X = yield i, и так как вызывается next(G) без передачи аргумента, X будет установлено в значение None. Затем срабатывает print(X), и выводится None.Затем генератор продолжает выполнение, и значение
X становится равным 1.