Can generator be used more than once?

后端 未结 3 991
遇见更好的自我
遇见更好的自我 2021-02-13 07:18

This is my piece of code with two generators defined:

one_line_gen = (x for x in range(3))

def three_line_gen():
    yield 0
    yield 1
    yield 2


        
相关标签:
3条回答
  • 2021-02-13 07:45

    three_line_gen is not a generator, it's a function. What it returns when you call it is a generator, a brand new one each time you call it. Each time you put parenthesis like this:

    three_line_gen()
    

    It is a brand new generator to be iterated on. If however you were to first do

    mygen = three_line_gen()
    

    and iterate over mygen twice, the second time will fail as you expect.

    0 讨论(0)
  • 2021-02-13 07:45

    Yes, generator can be used only once. but you have two generator object.

    # Python 3
    
    
    def three_line_gen():
        yield 0
        yield 1
        yield 2
    
    iterator = three_line_gen()
    print(iterator)
    for x in iterator:
        print(id(iterator), x)
    
    iterator2 = three_line_gen()
    print(iterator2)
    for x in iterator2:
        print(id(iterator2), x)
    

    And the result is:

    <generator object three_line_gen at 0x1020401b0>
    4328784304 0
    4328784304 1
    4328784304 2
    <generator object three_line_gen at 0x1020401f8>
    4328784376 0
    4328784376 1
    4328784376 2
    
    0 讨论(0)
  • 2021-02-13 07:59

    no, you can not iterate over a generator twice. a generator is exhausted once you have iterated over it. you may make a copy of a generator with tee though:

    from itertools import tee
    
    one_line_gen = (x for x in range(3))
    gen1, gen2 = tee(one_line_gen)
    # or: 
    # gen1, gen2 = tee(x for x in range(3))
    
    for item in gen1:
        print(item)
    
    for item in gen2:
        print(item)
    

    for the other issues see Ofer Sadan's answer.

    0 讨论(0)
提交回复
热议问题