Сообщить об ошибке.

Функция accumulate() модуля itertools в Python

Накопление результатов работы функции для элементов списка

Синтаксис:

import itertools

itertools.accumulate(iterable[, func, *, initial=None])

Параметры:

Возвращаемое значение:

Описание:

Функция accumulate() модуля itertools создает итератор, который возвращает накопленные суммы или накопленные результаты другой функции, которая задается с помощью необязательного аргумента func.

Если указан необязательный аргумент func, он должен быть функцией, принимающей два аргумента. Первый аргумент функцией - это накопленный результат, второй аргумент функции - следующий элемент iterable.

Элементы итерируемой последовательности могут быть любые типы, которые могут быть приняты в качестве аргументов для func. Например, при операции сложения по умолчанию добавляемые элементы могут быть любого типа, включая десятичные или рациональные числа.

Обычно количество элементов возвращаемого итератора совпадает с количеством элементов во входном итераторе iterable. Однако, если задано ключевой аргумент initial, то накопление начинается с начального значения initial и в этом случае возвращаемый итератор будет иметь один дополнительный элемент.

Функция itertools.accumulate() примерно эквивалентна следующему коду:

def accumulate(iterable, func=operator.add, *, initial=None):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    total = initial
    if initial is None:
        try:
            total = next(it)
        except StopIteration:
            return
    yield total
    for element in it:
        total = func(total, element)
        yield total

Примеры использования:

Можно установить значение min() для рабочего минимума, max() для рабочего максимума или operator.mul() для работающего продукта:

>>> from itertools import accumulate
>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, operator.mul)) 
# [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
>>> list(accumulate(data, max))
# [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

Можно построить таблицы амортизации, накапливая проценты и применяя платежи:

# Амортизация 5%, кредит 1000 с 4 ежегодными платежами по 90
>>> from itertools import accumulate
>>> cashflows = [1000, -90, -90, -90, -90]
>>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt))
# [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]

Можно смоделировать логистическое отображение, указав начальное значение в iterable и используя только накопленный результат в аргументе func:

# Хаотическое рекуррентное отношение
>>> from itertools import accumulate, repeat
>>> logistic_map = lambda x, _:  r * x * (1 - x)
>>> r = 3.8
>>> x0 = 0.4
# используется только начальное значение
>>> inputs = repeat(x0, 36)
>>> [format(x, '.2f') for x in accumulate(inputs, logistic_map)]
# ['0.40', '0.91', '0.30', '0.81', '0.60', '0.92', '0.29', '0.79', '0.63',
#  '0.88', '0.39', '0.90', '0.33', '0.84', '0.52', '0.95', '0.18', '0.57',
#  '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32',
#  '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60']