这个排列生成器中的 'yield' 是如何工作的?

4
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是如何相互连接的。我的理解是yieldreturn一样,但它暂停执行直到再次被调用。这些yield是如何工作的呢?


1
请查看https://dev59.com/yXVC5IYBdhLWcg3woSpW。 - tobias_k
2
这听起来更像是你不理解它的递归本质。 - dawg
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”当前排列即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接