Python初学者被一行复杂的代码搞糊涂了

2024-06-28 21:14:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我理解代码的要旨,即它形成排列;但是,我想知道是否有人可以解释return语句中到底发生了什么。在

def perm(l):
    sz = len(l)
    print (l)
    if sz <= 1:
        print ('sz <= 1')
        return [l]
    return [p[:i]+[l[0]]+p[i:] for i in range(sz) for p in perm(l[1:])]

Tags: 代码inforlenreturnifdefrange
2条回答

看看这个:

>>> l = [1, 2, 3, 4, 5, 6]
>>> p = l[1:]
>>> p
[2, 3, 4, 5, 6]
>>> i = 3
>>> p[:i]
[2, 3, 4]
>>> p[i:]
[5, 6]
>>> p[:i]+[l[0]]+p[i:]
[2, 3, 4, 1, 5, 6]
>>> 

所以,这里有一件事,p代表l[1:]的所有排列(即l减去第一个元素)。接下来,irange(sz),这意味着它从0到l的长度不等。这将把p拆分为两个所有可能大小的列表(0和sz,1和sz-1,2和sz-2,等等),并在这两个列表之间插入l的第一个元素——没有被置换的元素。在

return语句使用列表理解。如果将其放入实际循环中,则更容易理解:

value = []
for i in range(sz):
    # call this function using all but the first item in l
    for p in perm(l[1:]):
        # now place the first item in l between index i-1 and index i in p
        value.append(p[:i] + [l[0]] + p[i:])
return value

相关问题 更多 >