python sum函数 - 需要`start'参数说明

时间:2012-08-30 17:28:04

标签: python sum

我正在尝试了解内置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
    
  3. 我只是对此感到茫然,并且不知道发生了什么。以下是python文档所说的内容:http://docs.python.org/library/functions.html#sum。这没有给出'如果开始不是字符串而不是整数怎么办?'

    的任何解释

4 个答案:

答案 0 :(得分:16)

Sum做了类似的事情

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与list一起使用的常见情况是将列表列表转换为列表

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

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

答案 1 :(得分:4)

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

此错误与start参数无关。列表b中有两个项目。其中一个是[[[[[1], 2], 3], 4], 5],另一个是6,并且列表和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]

答案 2 :(得分:1)

其他答案中暗示但未明确说明的事情之一是 start值定义了返回值的type和要求的项目< / strong>即可。因为默认值是start=0,(当然,0是一个整数),iterable中的所有项必须是整数(或者带有__add__方法的类型才能使用整数)。其他例子提到了连接列表:

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

timedate.timedelta个对象:

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

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

答案 3 :(得分:0)

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

list.get(0).get("firstname");

而不是

sum(iterable,start=0) 

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

全功能:

sum(values,start=0)