yield'在这个排列生成器中是怎么工作的?
def perm_generator(lst):
if len(lst) == 1:
yield lst
else:
for i in range(len(lst)):
for perm in perm_generator(lst[:i] + lst[i+1:]):
yield [lst[i]] + perm
这段代码让我很困惑,因为我不明白这些yield
是怎么连接在一起的。我原本以为yield
就像return
一样,但它是暂时停止,直到再次被调用。那这些yield
到底是怎么工作的呢?
1 个回答
1
看一个不使用生成器的版本可能会更有帮助:
def perm_generator(lst):
res = []
if len(lst) == 1:
return [lst]
else:
for i in range(len(lst)):
for perm in perm_generator(lst[:i] + lst[i+1:]):
res.append([lst[i]] + perm)
return res
gen = perm_generator([1,2,3])
print gen # prints [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
你可以看到,这并不是简单地把“return”换成“yield”。在使用“return”的版本中,我们需要把结果一个个累积起来,而在使用“yield”的版本中,只需要“yield”当前的排列结果就可以了。