Это return
возвращает понимание списка, элементы которого создаются путем вставки первого элемента l
в каждую позицию p
, от первого до последнего - 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
это также показывает, насколько неэффективен этот код: он вызывает 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
и эквивалент этого, намного лучшего кода, представляет собой понимание списка с заменой двух for
предложений:
return [p[:i]+[l[0]]+p[i:] for p in perm(l[1:]) for i in range(sz)]