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

Python 空元组作为sum()的第二个参数,python,Python,为什么sum()的第二个参数可以是空元组?这不应该是一个数字吗 第二个参数是起始值。这不是一个开始的索引,而是一个开始求和的值 例如: 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:+:'int'和'tuple'不支持的操作数类型简短回答:因为+(由

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


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

例如:

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:+:'int'和'tuple'不支持的操作数类型
简短回答:因为
+
(由
sum
使用)可以重新定义,如果您不提供一个数值的iterable,您需要某种方式提供一个适合类型的起始值


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

>>> 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')
总和(((1,2),('a','b')) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:不支持+:“int”和“tuple”的操作数类型 >>>总和(((1,2),('a','b'),()) (1、2、‘a’、‘b’) >>>和(((1,2),('a','b'),(真,)) (对,1,2,'a','b') 解释了默认参数,但由于二次方面的原因,
sum
不应用于展平元组或列表。看

因此:

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

是的,它应该是一个数字,
sum
应该始终应用于数字元素,如果您想保持这种效率的话。此默认参数用于提供
0
0.0
的替代选项

每次遇到要求和的项时,它不会执行就地加法,而是执行(内部)类似的操作:

这导致
O(n**2)
列表或
元组
的复杂性,因为每次迭代都需要复制旧内容。所以不要这样做(注意,
str
type会显式阻止它)

相反,使用双平面压缩并从中创建一个
元组

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

result = tuple(x for st in tmp for x in st)

如果你的元组有很多元素,你会看到速度上的差异。

请注意,你不应该用它来压扁元组,因为它的复杂性太可怕了。
result = result + new_item
tmp=((1,2), ('a','b'))

result = tuple(x for st in tmp for x in st)