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

2024-05-06 20:52:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: httpsorgdocs参数htmllibrary数字functions
3条回答

第二个参数是起始值。这不是要开始的索引,而是要开始求和的值。你知道吗

例如:

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

所以:

Why does the 2nd parameter to the sum() can be an empty tuple? Shouldn't it be a number

是的,它应该是一个数字,sum应该总是应用于数字元素,如果你想保持这个效率的话。此默认参数用于提供00.0的替代方法。你知道吗

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

result = result + new_item

这会导致O(n**2)list的复杂性,因为每次迭代都需要复制旧内容。所以不要这样做(注意它是显式地为str类型阻塞的)。你知道吗

相反,使用双平面压缩并从中创建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不知道元组串联的等效值是什么,您必须直接提供它。你知道吗

>>> 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')

相关问题 更多 >