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

时间:2011-05-26 08:33:07

标签: 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__":
    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 ????

4 个答案:

答案 0 :(得分:7)

一旦生成器生成了它生成的所有内容,生成器就会耗尽,而列表可以多次迭代。

您的comb生成器依赖于能够遍历第二个及以后的序列,它会多次传递,因此如果这些序列实际上是一个生成器,则无效。

答案 1 :(得分:2)

原因是您只能迭代生成器一次。在行

for item in seqs[0]

当你到达gen1的第二个元素时,你进行递归调用以迭代gen2的元素。问题是你已经在之前的递归调用中迭代了gen2,所以它不会产生任何项目。

答案 2 :(得分:2)

修正:

def comb(seqs):
    if seqs:
        inner = list(comb(seqs[1:]))        
        for item in seqs[0]:
            for rest in inner:
                yield [item] + rest
    else:
        yield []

答案 3 :(得分:0)

看看docs.python.org中的itertools,你可能会找到创建迭代器以实现高效循环所需的一切