简体   繁体   中英

Using next() on generator function

I have this generator function:-

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

Now when i am calling next() on gen(); it is giving the first element each time.

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

But when i use that in a for loop; it works as expected:-

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

Can someone explain the cause of this effect; and the concept that i am missing here??

Each time you call the function it returns a generator object. And each time you call the next on it you'll get the first item which is 0 * 0 because you're not calling the next on same object (each time a new one). But in second case you're looping over one generator object and it will continue to consuming the generator until it hit the StopIteration .

For a better demonstration you can create two iterator objects from your generator function and loop over them simultaneously:

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

Your function returns a new generator each time you call gen() .

I think the simplest way to understand is to contrast what you are doing:

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

with this:

>>> 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

In this latter case, I am getting new values from the same generator.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM