Использование next () в функции генератора - PullRequest
0 голосов
/ 28 мая 2018

У меня есть функция генератора: -

>>> def gen():
...     for i in range(3):
...             yield i*i

Теперь, когда я вызываю next () для gen ();это дает первый элемент каждый раз.

>>> next(gen())
0
>>> next(gen())
0

Но когда я использую это в цикле for;это работает, как и ожидалось: -

>>> for i in gen():
...     print(i)
... 
0
1
4

Может кто-нибудь объяснить причину этого эффекта;и концепция, что я здесь скучаю ??

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Ваша функция возвращает новый генератор каждый раз, когда вы вызываете gen().

Я думаю, что самый простой способ понять это сопоставить то, что вы делаете:

>>> next(gen())
0
>>> next(gen())
0

с этим:

>>> my_gen = gen()
>>> next(my_gen)
0
>>> next(my_gen)
1
>>> next(my_gen)
4
>>> next(my_gen)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

В этом последнем случае я получаю новые значения от того же генератора.

0 голосов
/ 28 мая 2018

Каждый раз, когда вы вызываете функцию, она возвращает объект генератора.И каждый раз, когда вы вызываете следующий объект, вы получаете первый элемент 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
...