yield'在这个排列生成器中是怎么工作的?

4 投票
1 回答
1656 浏览
提问于 2025-04-18 14:55
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”当前的排列结果就可以了。

撰写回答