为什么在python的内置sum函数中有一个start参数

Fro*_*Zzz 9 python

sum函数中,原型是sum(iterable [,start]),它将可迭代对象中的所有内容加上起始值相加.我想知道为什么这里有起始价值?有没有特定的用例需要这个值?

请不要再举例说明如何使用start.我想知道为什么它存在于这个函数中.如果sum函数的原型只是sum(可迭代),并且如果iterable为空则返回None,一切都会正常工作.那么为什么我们需要从这里开始呢?

Mar*_*ers 15

如果要对不是整数的事物求和,则可能需要提供起始值以避免错误.

>>> from datetime import timedelta
>>> timedeltas = [timedelta(1), timedelta(2)]

>>> sum(timedeltas)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'

>>> sum(timedeltas, timedelta())
datetime.timedelta(3)
Run Code Online (Sandbox Code Playgroud)

  • 更一般地说,"sum"是一种[foldr](http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29)函数,它可能需要一个初始值(维基百科文章中的*z*) . (7认同)
  • @Karl Knechtel,@ziliangdotme:sum()可以在不添加第一个元素的情况下实现.真正的问题是没有`start`参数,如果迭代是空的,你将面临一个两难选择. (5认同)
  • 我个人喜欢的另一个例子是当你有[[1,2,3],[4,5,6],[7,8,9]]并且你想要`[1,2,3,4, 5,6,7,8,9]`.你可以做一个简单的`sum([[1,2,3],[4,5,6],[7,8,9]],[])`来加入列表中的所有列表. (4认同)
  • @ JohnMachin关于空迭代的答案是唯一有意义的.我认为,默认使用第一个元素作为起始值会更好.例如,当将`Counter`s一起添加时,你必须这样做:`sum(计数器,start = Counter())`当`sum(计数器)`会更好. (3认同)
  • 这是因为start默认为0,timedelta不能添加int.如果最初没有启动参数,则此处不存在任何问题.那么为什么毕竟有一个开始的参数呢? (2认同)