python专家的问题:代码不';使用生成器调用时无法工作

python专家的问题:代码不';使用生成器调用时无法工作,python,generator,Python,Generator,我有一个无法解释的小片段。 目的是生成两个或多个序列的所有组合。 它在使用列表调用时工作,但在使用生成器调用时不工作 def comb(seqs): if seqs: for item in seqs[0]: for rest in comb(seqs[1:]): yield [item] + rest else: yield [] if __name__=="__main__":

我有一个无法解释的小片段。
目的是生成两个或多个序列的所有组合。
它在使用列表调用时工作,但在使用生成器调用时不工作

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

在中查看一下itertools,您可能会找到创建迭代器以实现高效循环所需的所有内容。

旁注:为什么不使用
itertool.product
?@Space\u牛仔:这是我自己的教益。我想知道为什么它不起作用。我接受你的答案。查尔斯也给了我正确的答案,但你是第一个,谢谢。@Alain:事实上,查尔斯是第一个发布完整答案的人。我发布了一个简短的,然后扩展它。