2024-05-06 20:52:19 发布
网友
为什么sum()的第二个参数可以是空元组?它不应该是一个根据https://docs.python.org/3/library/functions.html#sum的数字吗?你知道吗
>>> tmp=((1,2), ('a','b')) >>> sum(tmp, ()) (1, 2, 'a', 'b')
第二个参数是起始值。这不是要开始的索引,而是要开始求和的值。你知道吗
例如:
sum([1,2,3], 0)与0 + 1 + 2 + 3相同
sum([1,2,3], 0)
0 + 1 + 2 + 3
sum([1,2,3], 6)与6 + 1 + 2 + 3相同
sum([1,2,3], 6)
6 + 1 + 2 + 3
sum(((1,2), ('a','b')), ())与() + (1,2) + ('a','b')相同
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'
This answer解释了默认参数,但是sum不应该被用来展平元组或列表,因为二次方面。见could sum be faster on lists
sum
所以:
Why does the 2nd parameter to the sum() can be an empty tuple? Shouldn't it be a number
是的,它应该是一个数字,sum应该总是应用于数字元素,如果你想保持这个效率的话。此默认参数用于提供0或0.0的替代方法。你知道吗
0
0.0
每次遇到要求和的项时,它都不会执行就地加法,而是执行类似(内部)的操作:
result = result + new_item
这会导致O(n**2)或list的复杂性,因为每次迭代都需要复制旧内容。所以不要这样做(注意它是显式地为str类型阻塞的)。你知道吗
O(n**2)
list
str
相反,使用双平面压缩并从中创建tuple:
tuple
tmp=((1,2), ('a','b')) result = tuple(x for st in tmp for x in st)
如果你的元组有很多元素,你会看到速度的不同。你知道吗
简而言之:因为+(由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不知道元组串联的等效值是什么,您必须直接提供它。你知道吗
0 + (1, 2)
>>> 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')
第二个参数是起始值。这不是要开始的索引,而是要开始求和的值。你知道吗
例如:
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'
This answer解释了默认参数,但是
sum
不应该被用来展平元组或列表,因为二次方面。见could sum be faster on lists所以:
是的,它应该是一个数字,
sum
应该总是应用于数字元素,如果你想保持这个效率的话。此默认参数用于提供0
或0.0
的替代方法。你知道吗每次遇到要求和的项时,它都不会执行就地加法,而是执行类似(内部)的操作:
这会导致
O(n**2)
或list
的复杂性,因为每次迭代都需要复制旧内容。所以不要这样做(注意它是显式地为str
类型阻塞的)。你知道吗相反,使用双平面压缩并从中创建
tuple
:如果你的元组有很多元素,你会看到速度的不同。你知道吗
简而言之:因为
+
(由sum
使用)可以被重新定义,所以如果您不提供一个iterable的数值,您需要某种方式来提供一个适合类型的起始值。你知道吗第二个参数用作求和的“起点”。这基本上是求和的起点:
它的默认值是0,如果要求和的序列不是数字,则会出现问题,因为没有定义
0 + (1, 2)
。相反,您需要提供一个值,以便可以添加到序列的元素中;虽然0是数字加法的标识,sum
不知道元组串联的等效值是什么,您必须直接提供它。你知道吗相关问题 更多 >
编程相关推荐