Перебираю цикл в 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 шт):
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)
Объяснение:
temp = 1– начинаем из нейтрального элемента для умножения, т.к. temp будем только умножать (*=).suma = 0– начинаем из нейтрального элемента для складывания, т.к. значение suma будем только увеличивать (+=).for i in dig_list:– не надо применять индекс в цикле — нам не надо индекса, а только элементы списка.В самом цикле только
- умножаем предыдущее значение
temp(*=) и - увеличиваем предыдущее значение
suma(+=).
- умножаем предыдущее значение
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)
В программировании обычно (чаще всего) отсчет ведется с нуля, запомни это правило.
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
можно так попробовать наверное
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]))