SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Языки и платформы

Аккумулятор в программировании: 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 полезен для общей операции свёртки.

Не меняйте порядок без проверки

Не всякая операция ассоциативна: вычитание при разной группировке даёт разные ответы. Побочные эффекты внутри функции затрудняют проверку. Сначала задайте ожидаемый результат для пустого, одноэлементного и обычного набора, затем выбирайте цикл или библиотечную функцию.

Документация