Patrick Dennis
Patrick Dennis

Reputation: 331

Why must I use a variable to get values from a Python generator?

Why must I use a variable to obtain next() values from a Python generator?

    def my_gen():
    i = 0
    while i < 4:
         yield 2 * i
         i += 1

#p = my_gen()
#for i in range(4):
#    print(next(p))

##for i in range(4):
##    print(next(my_gen()))

In the above, the # block works, while the ## block returns 4 copies of the first "yield."

Upvotes: 0

Views: 76

Answers (2)

Aaron
Aaron

Reputation: 11075

just gonna add my $0.02...

this may help clear up some misconceptions:

def function_that_creates_a_generator(n):
    while n>0:
        yield n
        n - 1

# this
for x in function_that_creates_a_generator(5):
    print(x)

#is almost exactly the same as this
generator = function_that_creates_a_generator(5)
while True:
    try:
        x = generator.next() #same as: x = next(generator)
    except StopIteration:
        break
    print(x)

For loops are really just a prettier way of writing a while loop that continually asks an iterable object for its next element. when you ask an iterable for another object and it has none, it will raise a StopIteration exception that is automatically caught in for loops; signaling a break from the loop. In the while loop we simply break these things out individually instead of having them hidden by the interpreter.

Upvotes: 1

user149341
user149341

Reputation:

print(next(my_gen()))

Each time this runs, you're calling next() on a separate (and brand-new) generator returned by my_gen().

If you want to call next() on the same generator more than once, you'll need some way to keep that generator around for long enough to reuse it.

Upvotes: 2

Related Questions