空元组作为sum()的第二个参数

时间:2019-07-15 15:58:58

标签: python

为什么sum()的第二个参数可以是一个空元组?应该不是根据https://docs.python.org/3/library/functions.html#sum的数字吗?

>>> tmp=((1,2), ('a','b'))
>>> sum(tmp, ())
(1, 2, 'a', 'b')

3 个答案:

答案 0 :(得分:4)

第二个参数是起始值。这不是开始的索引,而是开始总和的值。

例如:

sum([1,2,3], 0)0 + 1 + 2 + 3

sum([1,2,3], 6)6 + 1 + 2 + 3

sum(((1,2), ('a','b')), ())() + (1,2) + ('a','b')

由于默认情况下start为0,因此如果您不为其指定值,则会得到

0 + (1,2) + ('a','b')

哪个给

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

答案 1 :(得分:2)

简短的回答:由于+(由sum使用)可以重新定义,因此,如果不提供可迭代的数值,则需要某种方式来提供适合类型的起始值。


第二个参数用作总和中的“起点”。这基本上是求和的起点:

>>> sum([1,2,3])
6
>>> sum([1,2,3], 0)
6
>>> sum([1,2,3], 2)
8

其默认值为0,如果您要求和的序列不是数字,则会导致问题,因为0 + (1, 2)未定义。相反,您需要提供一个可以在序列元素中添加 的值;虽然0是数字加法的标识,但是sum不知道元组串联的等效值是什么,您必须直接提供它。

>>> sum(((1,2), ('a', 'b')))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
>>> sum(((1,2), ('a', 'b')), ())
(1, 2, 'a', 'b')
>>> sum(((1,2), ('a', 'b')), (True,))
(True, 1, 2, 'a', 'b')

答案 2 :(得分:0)

This answer解释了默认参数,但是由于二次方的原因,sum不应永远用来扁平化元组或列表。参见could sum be faster on lists

所以:

  

为什么sum()的第二个参数可以是一个空元组?应该不是数字

是的,应该是一个数字,如果您想保持效率,sum应该始终应用于数字元素。这里的默认参数是00.0的替代方法。

每次遇到要累加的项目时,它都不执行就地加法,而是执行(内部)之类的事情:

result = result + new_item

这会导致O(n**2)list的{​​{1}}复杂性,因为每次迭代都需要复制旧内容。因此,请勿执行此操作(请注意,tuple类型已将其明确阻止)。

相反,请使用双重扁平理解并在其中创建一个str

tuple

如果您的元组元组包含很多元素,您会看到速度差异。