Перебираю цикл в Python и теряю один элемент - почему?

Мне необходимо получить такой результат:

(x - 30)(x - 20)(x - 10) + (x - 20)*(x - 10) + (x - 10)

И, вроде бы, написанный код должен к этому вести, но слагаемое (x - 10) теряется. В чем загвоздка?

Код:

from sympy import symbols
x = symbols('x')
dig_list = [10, 20, 30]

poly_0 = x-dig_list[0]
for i in range(1, len(dig_list)):   
    poly_n = poly_0 * (x-dig_list[i])
    # кажется, что при первом проходе poly_0 в summa должен давать искомое слагаемое:
    summa = poly_0 + poly_n
    poly_0 = poly_n
print(summa)

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

Автор решения: MarianD
from sympy import symbols
x = symbols('x')
dig_list = [10, 20, 30]

temp = 1
summa = 0
for i in dig_list: 
    temp *= (x - i)
    summa += temp
print(summa)

Объяснение:

  1. temp = 1 – начинаем из нейтрального элемента для умножения, т.к. temp будем только умножать (*=).

  2. suma = 0 – начинаем из нейтрального элемента для складывания, т.к. значение suma будем только увеличивать (+=).

  3. for i in dig_list:– не надо применять индекс в цикле — нам не надо индекса, а только элементы списка.

  4. В самом цикле только

    • умножаем предыдущее значение temp (*=) и
    • увеличиваем предыдущее значение suma (+=).
→ Ссылка
Автор решения: OlegUP
from sympy import symbols
x = symbols('x')
dig_list = [10, 20, 30]

poly_0 = x-dig_list[0]
for i in range(len(dig_list)):   # Считает с нуля до len(dig_list) - 1
    poly_n = poly_0 * (x-dig_list[i])
    # кажется, что при первом проходе poly_0 в summa должен давать искомое слагаемое:
    summa = poly_0 + poly_n
    poly_0 = poly_n
print(summa)

В программировании обычно (чаще всего) отсчет ведется с нуля, запомни это правило.

→ Ссылка
Автор решения: MBo

summa же теряет старое значение

poly_0 = x-dig_list[0]
summa = poly_0
for i in range(1, len(dig_list)):
    poly_n = poly_0 * (x-dig_list[i])
    # кажется, что при первом проходе poly_0 в summa должен давать искомое слагаемое:
    summa += poly_n
    poly_0 = poly_n
print(summa)

>>>  x + (x - 30)*(x - 20)*(x - 10) + (x - 20)*(x - 10) - 10
→ Ссылка
Автор решения: Zhihar

можно так попробовать наверное

import math

def summa(x, dig_list):
    subs = [x - v for v in dig_list]

    return sum(math.prod(subs[i:]) for i in range(len(subs)))

print(summa(1, [30, 20, 10]))

только заметьте, что массив начальный я в обратном порядке передаю, ну или если это не хочется, то сделать dig_list[::-1]

ну или если хочется в одну строку

summa = lambda x, dig_list: sum(__import__('math').prod([x - v for v in dig_list[i:]]) for i in range(len(dig_list)))

print(summa(1, [30, 20, 10]))
→ Ссылка