Python初学者被复杂的代码行所困惑

4 python list-comprehension

我理解代码的要点,它形成了排列; 但是,我想知道是否有人能够在退货声明中准确解释发生了什么.

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:])]
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 10

return将返回一个列表理解,其项目是通过将第一项插入到第一项lp最后一项的每个位置而产生的 - p反过来是一个列表列表,通过递归调用获得perm排除第一项l(从而以所有可能的方式置换所有其他项目).

如果你不理解递归,那么解释并不是很简单;-).如果你不理解列表理解,那么它们容易解释 - 这return在语义上等同于

result = []
for i in range(sz):
  for p in perm(l[1:]):
    result.append(p[:i]+[l[0]]+p[i:])
return result
Run Code Online (Sandbox Code Playgroud)

这也表明了这段代码效率低下:它以perm递归方式调用sz,显然没有必要.更好的是简单地交换两个for循环:

result = []
for p in perm(l[1:]):
  for i in range(sz):
    result.append(p[:i]+[l[0]]+p[i:])
return result
Run Code Online (Sandbox Code Playgroud)

相当于这个,更好的代码,是一个列表理解与for交换的两个子句:

return [p[:i]+[l[0]]+p[i:] for p in perm(l[1:]) for i in range(sz)]
Run Code Online (Sandbox Code Playgroud)