Yield multiple values

前端 未结 3 435
长发绾君心
长发绾君心 2021-01-30 20:56

Can\'t we yield more than one value in the python generator functions?

Example,

In [677]: def gen():
   .....:     for i in range(5):
   .....:         y         


        
相关标签:
3条回答
  • 2021-01-30 21:12

    Because gen() returns a generator (a single item - so it can't be unpacked as two), it needs to be advanced first to get the values...

    g = gen()
    a, b = next(g)
    

    It works with list because that implicitly consumes the generator.

    Can we further make this a generator? Something like this:

    g = gen();
    def yield_g():
        yield g.next();
        k1,k2 = yield_g();
    

    and therefore list(k1) would give [0,1,2,3,4] and list(k2) would give [1,2,3,4,5].

    Keep your existing generator, and use izip (or zip):

    from itertools import izip
    k1, k2 = izip(*gen())
    
    0 讨论(0)
  • 2021-01-30 21:14

    Use yield from

    def gen():
        for i in range(5):
            yield from (i, i+1)
    
    [v for v in gen()]
    # [0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
    

    The python docs say:

    When yield from <expr> is used, it treats the supplied expression as a subiterator.

    0 讨论(0)
  • 2021-01-30 21:23

    Your function gen returns a generator and not values as you might expect judging from the example you gave. If you iterate over the generator the pairs of values will be yielded:

    In [2]: def gen():
       ...:     for i in range(5):
       ...:         yield i, i+1
       ...:         
    
    In [3]: for k1, k2 in gen():
       ...:     print k1, k2
       ...:     
    0 1
    1 2
    2 3
    3 4
    4 5
    
    0 讨论(0)
提交回复
热议问题