Каждый раз, когда вы вызываете функцию, она возвращает объект генератора.И каждый раз, когда вы вызываете следующий объект, вы получаете первый элемент 0 * 0
, потому что вы не вызываете следующий элемент для того же объекта (каждый раз новый).Но во втором случае вы зацикливаетесь на одном объекте-генераторе, и он будет продолжать потреблять генератор, пока он не достигнет значения StopIteration
.
. Для лучшей демонстрации вы можете создать два объекта итератора из функции-генератора и цикланад ними одновременно:
In [17]: g = gen()
In [18]: k = gen()
In [19]: for i, j in zip(g, k):
...: print(i, j)
...:
0 0
1 1
4 4