为什么sum()的第二个参数可以是一个空元组?应该不是根据https://docs.python.org/3/library/functions.html#sum的数字吗?
>>> tmp=((1,2), ('a','b'))
>>> sum(tmp, ())
(1, 2, 'a', 'b')
答案 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
应该始终应用于数字元素。这里的默认参数是0
或0.0
的替代方法。
每次遇到要累加的项目时,它都不执行就地加法,而是执行(内部)之类的事情:
result = result + new_item
这会导致O(n**2)
或list
的{{1}}复杂性,因为每次迭代都需要复制旧内容。因此,请勿执行此操作(请注意,tuple
类型已将其明确阻止)。
相反,请使用双重扁平理解并在其中创建一个str
:
tuple
如果您的元组元组包含很多元素,您会看到速度差异。