Python

Сложение чисел из цикла с отображением не только суммы, но и процесса

Снова задачка из курса питона для чайников.

Введите натуральное число: 6 (это инпут)
При N = 6 элементы выражения будут равны:
(далее цикл for с подстановкой n в формулу)
n = 0
elem = (-1)**0 * 1/(2**0) = 1.0
n = 1
elem = (-1)**1 * 1/(2**1) = -0.5
n = 2
elem = (-1)**2 * 1/(2**2) = 0.25
n = 3
elem = (-1)**3 * 1/(2**3) = -0.125
n = 4
elem = (-1)**4 * 1/(2**4) = 0.0625
n = 5
elem = (-1)**5 * 1/(2**5) = -0.03125

Сумма равна: 0.65625

Нужно, чтобы в конце было не "Сумма равна: 0.65625", а "Сумма равна: 1 - 0,5 + 0,25 - 0,125 + 0,0625 - 0,03125 = 0,65625", то есть чтобы был выведен сам процесс сложения всех значений elem
Вот простой код Python, который реализует требуемую функцию:
 N = int(input("Введите натуральное число: ")) 

print("При N = {} элементы выражения будут равны:".format(N))

sum = 0
elements = []

for n in range(N+1):
elem = (-1)**n * 1/(2**n)
elements.append('{:.5f}'.format(elem))
print("n = {}".format(n))
print("elem = (-1)**{} * 1/(2**{}) = {}".format(n,n,elem))
sum += elem

elements_joined = ' + '.join(elements).replace('+ -', '- ')

print("Сумма равна: {} = {}".format(elements_joined, '{:.5f}'.format(sum)))
В этом коде мы используем конструкцию '+' в join(), чтобы объединить все элементы списка в одну строку, разделяя их оператором '+'. Затем мы заменяем '+ -' на '-', чтобы отображение было корректным для отрицательных значений.
Леонид Храковский
Леонид Храковский
25 860
Лучший ответ
По-школьному будет так:
 n = int(input())
s = m = g = 1
print(m, end = ' ')
for _ in range(1, n):
m /= 2
g = -g
print(('-', '+')[g >= 0], m, end = ' ')
s += g * m
print('=', s)

А по-взрослому - вот так:
 from functools import reduce
from itertools import accumulate, repeat

def acc(t, x):
s, vs = t
return s + x, vs + ' ' + ('-', '+')[x >= 0] + ' ' + str(abs(x))

s, vs = reduce(acc, accumulate(repeat(-.5, n - 2), float.__mul__, initial=-.5), (1, '1'))
print(vs, '=', s)

Хотя, шустрее будет собрать вывод в список и в конце сконкатенировать через пробел:
 from functools import reduce
from itertools import accumulate, repeat

def acc(t, x):
s, vs = t
return s + x, vs + [('-', '+')[x >= 0], abs(x)]

s, vs = reduce(acc, accumulate(repeat(-.5, n - 2), float.__mul__, initial=-.5), (1, [1]))
print(' '.join(map(str, vs)), '=', s)

А если слагаемых ряда немного, то последний принт заменить на это:
 print(*vs, '=', s) 
про f строки почитай