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
如何运作?
答案 0 :(得分: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]]
正如你所看到的 - 这不是“回报”与“收益”的“发现和替换”。在“返回”版本中,我们需要累积结果,而在“yield”版本中,所有需要做的就是“产生”当前的排列。