Python 空元组作为sum()的第二个参数
为什么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([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)