Не могу понять работу генератора списка

На странице расписано как найти все делители числа, вычислив простую факторизацию. Там указана вот эта функция. Мне не понятна строка: div = [d * p**e for d in div for e in range(r + 1)] из за двойного цикла. Можно ли развернуть эту запись в несколько строк чтобы я мог провести трассировку и самостоятельно разобраться в работе. P.S.Еще изучаю питон и некоторые хитрые семантические выверты мне не понятны.

def divisors(factors):
       div = [1]
       for (p, r) in factors:
           div = [d * p**e for d in div for e in range(r + 1)]
       return div

Ответы (1 шт):

Автор решения: SmellyNS

Данная строка не то что бы эквивалентна блоку ниже, но приносит тот же результат

div = []
for e in range(r+1):
    for d in div:
        div.append(d * p**e)

Конструкция, которую вы продемонстрировали, называется генератором списка. Используется таким образом:

Допустим, у нас есть список arr_to_copy, элементы из которого надо перенести в новый список result_array, умножив каждый из них при этом на 5

result_array = [eachElem*5 for eachElem in arr_to_copy ]

Разбирая ваш пример:

div = [d * p**e for d in div for e in range(r + 1)]

1) Квадратные скобки говорят о том, что тип данных переменной div - это [] (list)

2) Внутри скобок описаны значения его переменных, а именно...

3) for e in range(r+1) - итерируем range(r+1) для вычисления каждого элемента div. Для этого используем значение e

4) Далее, внутри итерации в пункте 3, итерируем for d in div, таким образом организуя двойной цикл

5) В левой части скобок находится выражение, которому будет равен каждый элемент списка div по порядку на каждом шаге итерации. d * p**e

Надеюсь, я объяснил всё предельно ясно. Если у вас остались вопросы, задайте их в комментарии и я постараюсь ответить, отредактировав этот ответ.

→ Ссылка