Не могу понять работу генератора списка
На странице расписано как найти все делители числа, вычислив простую факторизацию. Там указана вот эта функция.
Мне не понятна строка: 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 шт):
Данная строка не то что бы эквивалентна блоку ниже, но приносит тот же результат
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
Надеюсь, я объяснил всё предельно ясно. Если у вас остались вопросы, задайте их в комментарии и я постараюсь ответить, отредактировав этот ответ.