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:事实上,查尔斯是第一个发布完整答案的人。我发布了一个简短的,然后扩展它。