当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python itertools.accumulate用法及代码示例


用法:

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

创建一个迭代器,返回累积和或其他二进制函数的累积结果(通过可选的func 参数指定)。

如果提供了func,它应该是两个参数的函数。输入 iterable 的元素可以是任何可以被接受为 func 的参数的类型。 (例如,使用默认的加法运算,元素可以是任何可加类型,包括 DecimalFraction 。)

通常,输出的元素数量与输入的可迭代匹配。但是,如果提供了关键字参数 initial,则累加会导致 initial 值,因此输出比输入可迭代的元素多一个。

大致相当于:

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

func 参数有多种用途。它可以设置为min() 用于运行最小值,max() 用于运行最大值,或operator.mul() 用于运行产品。可以通过累积利息和应用付款来建立摊销表。 First-order recurrence relations 可以通过在迭代中提供初始值并仅使用 func 参数中的累积总数来建模:

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

# Amortize a 5% loan of 1000 with 4 annual payments of 90
>>> 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]

# Chaotic recurrence relation https://en.wikipedia.org/wiki/Logistic_map
>>> logistic_map = lambda x, _:  r * x * (1 - x)
>>> r = 3.8
>>> x0 = 0.4
>>> inputs = repeat(x0, 36)     # only the initial value is used
>>> [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']

有关仅返回最终累加值的类似函数,请参见functools.reduce()

3.2 版中的新函数。

在 3.3 版中更改:添加了可选的func范围。

在 3.8 版中更改:添加了可选的initial范围。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 itertools.accumulate。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。