【问题标题】:Using built-in sum() function on non integer iterable对非整数可迭代使用内置 sum() 函数
【发布时间】:2026-01-31 02:50:01
【问题描述】:

有没有办法重载内置函数 sum() 以便它在用户定义的可迭代对象上工作?假设可以使用 + 添加迭代中的元素。例如字符串。

具体来说,我希望能够做到以下几点

S = StrListIterable([<list of strings>])
concatedList = sum(S) # returns a concatenated string of all strings in S

显然,我可以在 S 的元素上使用简单的 join 语句来实现这一点,但我想知道 Python 是否支持重载某些标准内置函数。

【问题讨论】:

  • 您应该能够检查sum 使用的方法并拥有一个实现它的类
  • 您已经可以将它用于除整数之外的可迭代对象。它只是有一个特定的块来防止你在字符串上使用它。
  • sum 当然可以使用非数字类型,你只需要给它一个合适的起始值。但是,正如the sum docs 和这里的几个人所提到的,如果您尝试使用它来连接字符串,它会抱怨。但是您可以使用 sum(list_of_lists, []) 来连接一堆列表。
  • sum 不会连接字符串的原因是与使用.join 相比效率低下。类似的评论适用于通过reduce 进行的字符串连接,尽管使用reduce(或+=for 循环中)并不像在Python 2.5 之前那么糟糕,因为str 已经进行了一些优化来处理这个问题连接类型,因为很多人使用+ 连接而不是.join。有些人对此很满意,例如 Python core dev Alex Martelli

标签: python sum iterable


【解决方案1】:

在 python 中不要使用 sum 来连接字符串。你使用加入:

>>> S = StrListIterable([<list of strings>])
>>> concatedList = ''.join(S) # returns a concatenated string of all strings in S

其中 ''(空字符串)是连接符。

【讨论】:

    【解决方案2】:

    start 参数提供要添加的初始值。但是:

    >>> L = ['foo', 'bar', 'baz']
    >>> sum(L, '')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: sum() can't sum strings [use ''.join(seq) instead]
    >>> ''.join(L)
    'foobarbaz'
    

    【讨论】: