4

sum(iterable)有效地:

def sum(iterable):
    s = 0
    for x in iterable:
        s = s.__add__(x)
    return s

Python 是否有一个内置函数可以在不设置初始值的情况下完成此操作?

# add is interchangeable with sub, mul, etc.
def chain_add(iterable):
    iterator = iter(iterable)
    s = next(iterator)
    while True:
        try:
            s = s.__add__(next(iterator))
        except StopIteration:
            return s

我遇到的问题sum是它不适用于支持+运算符的其他类型,例如Counter.

4

3 回答 3

8

尝试查看 pythonreduce()函数:您传入一个函数、一个可迭代对象和一个可选的初始化程序,它将将该函数累积应用于所有值。

例如:

import functools
def f(x,y):
    return x+y

print functools.reduce(f, [1, 2, 3, 4]) # prints 10
print functools.reduce(f, [1, 2, 3, 4], 10) # prints 20, because it initializes at 10, not 0.

您可以根据您的可迭代更改功能,因此它非常可定制。

于 2012-08-14T22:56:49.083 回答
2

在添加的情况下:

import operator
reduce(operator.add, iterable)

这将适用于无法使用sum. 同样,您可以使用

reduce(operator.mul, iterable)
于 2012-08-14T22:56:50.567 回答
2

这是 for 的一个很好的用途,它在 Python 3reduce()中被移到了。functools.reduce()

下面是一个链接乘法的例子:

import functools
import operator

def chain_mul(iterable):
    return functools.reduce(operator.mul, iterable)

您可以将其替换为operatoroperator.mul模块中的其他函数之一,或者仅定义您自己的对其参数进行操作的双参数函数。

于 2012-08-14T22:59:35.497 回答