python专家的问题:用生成器调用时,代码不起作用

|| 我有一个小片段,它无法以无法解释的方式工作。 目的是生成两个或更多序列的所有组合。 当使用列表调用时,它起作用,但是当使用生成器调用时,它不起作用。
def comb(seqs):
    if seqs:
        for item in seqs[0]:
            for rest in comb(seqs[1:]):
                yield [item] + rest
    else:
        yield []

if __name__==\"__main__\":
    x=[1,2]
    y=[3,4]
    print list(comb([x,y])) # prints [[1, 3], [1, 4], [2, 3], [2, 4]]

    def gen1(): yield 1; yield 2
    def gen2(): yield 3; yield 4
    x=gen1()
    y=gen2()
    print list(comb([x,y])) # prints [[1, 3], [1, 4]  WHY ????
    
已邀请:
原因是您只能迭代一个生成器一次。在行中
for item in seqs[0]
当您到达
gen1
的第二个元素时,您将进行递归调用以迭代
gen2
的元素。问题在于您在上一个递归调用中已经遍历了
gen2
,因此不会产生任何项。     
一旦生成器生成了将要生成的所有内容,它就会被耗尽,而列表可以被迭代多次。 您的
comb
生成器依赖于能够遍历第二个及以后的序列,因此它会多次传递,因此如果这些序列实际上是生成器,则将无法工作。     
固定:
def comb(seqs):
    if seqs:
        inner = list(comb(seqs[1:]))        
        for item in seqs[0]:
            for rest in inner:
                yield [item] + rest
    else:
        yield []
    
看看docs.python.org中的itertools,您可能会在其中找到创建用于高效循环的迭代器所需的一切     

要回复问题请先登录注册