sum(iterable[, start])
从左到右汇总start和iterable的项目 返回总数。 start默认为0。可迭代的项目是 通常是数字,start值不允许是字符串。
对于某些用例,sum()有很好的替代方案。连接字符串序列的首选快速方法是调用 ''.join(sequence)。要使用扩展名添加浮点值 精度,见math.fsum()。要连接一系列迭代, 考虑使用itertools.chain()。
但是,您可以使用其他内容+,例如列表:
>>> ['foo'] + ['bar']
['foo', 'bar']
如果您尝试使用sum,但期望得到相同的结果,则会得到TypeError:
>>> sum((['foo'], ['bar']))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
sum((['foo'], ['bar']))
TypeError: unsupported operand type(s) for +: 'int' and 'list'
因为它现在在做0 + ['foo'] + ['bar']。
要解决此问题,您可以提供自己的start作为[],因此它会变为[] + ['foo'] + ['bar']并且一切都很好。所以回答:
为什么可以在这里写[]?
因为虽然start默认为数字,但 为1;其他的东西也可以添加,这对于的东西来说非常方便,就像你现在正在做的那样。
答案 1 :(得分:5)
实际上sum函数在每次迭代中使用可迭代的所有项调用__add__的{{1}}属性。
例如:
start
在这种情况下,结果将是输入列表的连接列表。实际上,在算法视角下,它执行以下过程:
>>> [].__add__([2,3])
[2, 3]
#OR
>>> [] + [1,2,3]
[1, 2, 3]
并非您可以在具有>>> a = [[1, 2], [3, 4], [5, 6]] >>> start = [] >>> for i in a: ... start += i ... >>> start [1, 2, 3, 4, 5, 6] 属性的每个对象序列上调用sum函数。但请注意,如果您的默认__add__参数为start object不是一个整数,它会引发0。在这种情况下,您需要为函数指定正确的TypeError。
start
答案 2 :(得分:2)
将start与您提供的可迭代内容相加作为第一个参数。 sum不会将type start限制为int,以便允许添加各种情况。
基本上,sum会做这样的事情:
a = [[1, 2], [3, 4], [5, 6]]
sum(a, number)
大致翻译为:
number += every value in the list a
由于列表a中的每个值都是一个列表,因此在扩展时,前一个求和值如下:
number + [1, 2] + [3, 4] + [5, 6]
因此,如果您输入int,则会导致不幸TypeError,因为不允许添加int和list。
1 + [1, 2] == I hope you like TypeErrors
但是,如果您输入列表[],它只会将a的元素加在一起,并生成我们知道并喜爱的扁平列表。
start的值默认为0和int,主要是因为最常见的求和情况是算术。