为什么sum起始值不是可迭代的零值?

时间:2012-06-12 18:58:01

标签: python types built-in

为什么sum无法自动获取正确的零值?

>>> sum((['1'], ['2']))

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    sum((['1'], ['2']))
TypeError: unsupported operand type(s) for +: 'int' and 'list'
>>> sum((['1'], ['2']), [])
['1', '2']

这样实现起来很简单:

>>> def sum(s, start=None):
    it = iter(s)
    n = next(it)
    if start is None:
        start = type(n)()
    return n + __builtins__.sum(it, start)

>>> sum((['1'], ['2']))
['1', '2']
>>>

但总和不会加入字符串,所以也许只是鼓励使用适当的方法来进行不同的“总结”。

另一方面,如果它仅用于数字,为什么不sum_numbers而不是sum作为名称。

编辑:要处理空序列,我们必须添加一些代码:

>> sum([])

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    sum([])
  File "<pyshell#28>", line 3, in sum
    n = next(it)
StopIteration
>>> def sum(s, start=None):
    it = iter(s)
    try:
        n= next(it)
    except:
        return 0

    if start is None:
        start = type(n)()
    return n + __builtins__.sum(it, start)

>>> sum([])
0
>>> 

1 个答案:

答案 0 :(得分:2)

在一般情况下,推断零值是不可能的。如果iterable生成没有零参数构造函数的用户定义类的实例,该怎么办?正如您所展示的那样,您可以轻松自行提供。