Аккумулятор в программировании: reduce и начальное значение
В программировании аккумулятор — промежуточный результат, обновляемый при обходе последовательности. Функция свёртки получает накопленное значение и очередной элемент. Это объяснение относится к обработке данных, а не к одноимённым понятиям лингвистики.
Простой цикл
numbers = [2, 3, 5]
total = 0
for number in numbers:
total += number
print(total) # 10Начальное значение 0 подходит для суммы. Для произведения начальным значением обычно служит 1; выбор не произвольный, он связан с операцией.
Та же идея с reduce
from functools import reduce
from operator import add
print(reduce(add, [2, 3, 5], 0)) # 10
print(reduce(add, [], 0)) # 0Явный initializer определяет результат пустой последовательности. Без него reduce берёт первый элемент как начальный и не может обработать пустой ввод. Для обычной суммы предпочтительнее понятный sum(numbers), а reduce полезен для общей операции свёртки.
Не меняйте порядок без проверки
Не всякая операция ассоциативна: вычитание при разной группировке даёт разные ответы. Побочные эффекты внутри функции затрудняют проверку. Сначала задайте ожидаемый результат для пустого, одноэлементного и обычного набора, затем выбирайте цикл или библиотечную функцию.