“置换”如何在这个排列生成器中工作?

时间:2014-07-27 08:17:57

标签: python generator permutation 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 个答案:

答案 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”版本中,所有需要做的就是“产生”当前的排列。