6

我试图了解内置sum()函数的工作原理,但是,这个start参数已经让我忘记了:

  1. a=[[1, 20], [2, 3]]
    b=[[[[[[1], 2], 3], 4], 5], 6]
    >>> sum(b,a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    >>> sum(a,b)
    [[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3]
    
  2. >>> a=[1,2]
    >>> b=[3,4]
    >>> sum(a,b)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    >>> sum(b,a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    

我对此感到目瞪口呆,不知道发生了什么。这是 python 文档必须说的: http: //docs.python.org/library/functions.html#sum。这没有对“如果开始不是字符串而不是整数怎么办?”给出任何解释。

4

4 回答 4

21

总和做这样的事情

def sum(values, start = 0):
    total = start
    for value in values:
        total = total + value
    return total

sum([1,2],[3,4])展开类似[3,4] + 1 + 2的内容,您可以看到它尝试将数字和列表相加。

为了用于sum生成列表,值应该是列表的列表,而 start 可以只是一个列表。您会在失败的示例中看到该列表至少包含一些整数,而不是所有列表。

您可能会想到将 sum 与列表一起使用的通常情况是将列表列表转换为列表

sum([[1,2],[3,4]], []) == [1,2,3,4]

但实际上你不应该这样做,因为它会很慢。

于 2012-08-30T17:36:22.267 回答
5
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
sum(b, a)

此错误与 start 参数无关。列表中有两个项目b。其中一个是[[[[[1], 2], 3], 4], 5],另一个是6,并且 list 和 int 不能相加。

sum(a, b)

这是添加:

[[[[[[1], 2], 3], 4], 5], 6] + [1, 20] + [2, 3]

哪个工作正常(因为您只是将列表添加到列表中)。

a=[1,2]
b=[3,4]
sum(a,b)

这是尝试添加[3,4] + 1 + 2,这又是不可能的。同样,sum(b,a)正在添加[1, 2] + 3 + 4.

如果 start 不是字符串也不是整数怎么办?

sum不能对字符串求和。看:

>>> sum(["a", "b"], "c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
于 2012-08-30T17:36:02.907 回答
3

在其他答案中已暗示但未明确说明的一件事是start值定义了type返回值和被求和的项目。因为默认值是start=0, (当然 0 是整数)可迭代对象中的所有项都必须是整数(或具有__add__处理整数的方法的类型)。其他示例提到了连接列表:

( sum([[1,2],[3,4]], []) == [1,2,3,4])

timedate.timedelta对象:

( sum([timedelta(1), timedelta(2)], timedelta()) == timedelta(3))。

请注意,这两个示例都将可迭代类型的空对象作为开始参数传递,以避免出现TypeError: unsupported operand type(s) for +: 'int' and 'list'错误。

于 2017-01-27T15:24:21.813 回答
0

我只是想澄清一些困惑。
sum 函数的签名应该是:

sum(iterable,start=0) 

而不是

sum(values,start=0)

如上所述。此更改将使签名更清晰。

全功能:

def sum(iterable,start=0):
       total=start
       for val in iterable:
            total+=val
       return total
于 2020-04-29T11:06:15.640 回答