当前位置: 首页 > 面试题库 >

Python总和,为什么不字符串呢?

有凯泽
2023-03-14
问题内容

Python具有内置函数sum,实际上等效于:

def sum2(iterable, start=0):
    return start + reduce(operator.add, iterable)

适用于所有类型的参数(字符串除外)。它适用于数字和列表,例如:

 sum([1,2,3], 0) = sum2([1,2,3],0) = 6    #Note: 0 is the default value for start, but I include it for clarity
 sum({888:1}, 0) = sum2({888:1},0) = 888

为什么特地省去了弦乐?

 sum( ['foo','bar'], '') # TypeError: sum() can't sum strings [use ''.join(seq) instead]
 sum2(['foo','bar'], '') = 'foobar'

我似乎还记得在Python列表中进行讨论的原因,因此可以使用一个解释或指向该解释的线程的链接。

编辑 :我知道标准方法是这样做"".join。我的问题是为什么禁止对字符串使用sum的选项,而列表却没有禁止。

编辑2 :尽管我认为给出所有好的答案都 不需要这样做 ,但问题是:
为什么sum在一个可迭代的包含数字或一个可迭代的包含列表而不在一个可迭代的包含字符串上起作用?


问题答案:

Python试图阻止您“添加”字符串。您应该加入他们的行列:

"".join(list_of_strings)

它快得多,并且使用的内存更少。

快速基准:

$ python -m timeit -s 'import operator; strings = ["a"]*10000' 'r = reduce(operator.add, strings)'
100 loops, best of 3: 8.46 msec per loop
$ python -m timeit -s 'import operator; strings = ["a"]*10000' 'r = "".join(strings)'
1000 loops, best of 3: 296 usec per loop

编辑(回答OP的编辑):关于为什么字符串显然是“单一”的,我相信这只是针对常见情况进行优化以及实施最佳实践的问题:您可以使用’‘更快地连接字符串。加入,因此明确禁止使用字符串sum会向新手指出。

顺便说一句,此限制已“永远存在”,即,由于将限制sum添加为内置功能(修订版32347)



 类似资料:
  • 问题内容: 我有以下python代码。 我得到以下日志打印输出。 如果我使用split(),btw代替split(’‘),则会得到相同的日志打印输出。 为什么split不将结果分成6个条目的列表?我想问题是涉及到http请求,因为我在gae交互式控制台中的测试获得了预期的结果。 问题答案: 不修改字符串。它返回拆分列表。如果要使用该列表,则需要使用来将其分配给某些内容。

  • 问题内容: 与使用循环相比,在Python中是否有一种更惯用的方式来计算字符串长度? 我试过了,但只适用于整数: 问题答案: 我知道这是一个老问题,但是我不禁注意到Python错误消息 告诉 您如何执行此操作: 所以:

  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 问题内容: 他们为什么决定使用 Java和.NET(和其他一些语言)使其不可变?他们为什么不使它可变? 问题答案: 根据Effective Java第四章第73页第2版: “这样做有很多充分的理由:不可变的类比可变的类更易于设计,实现和使用。它们不易出错且更安全。 […] “ 不可变对象很简单。不可变对象可以恰好处于一种状态,即创建时的状态。如果确保所有构造函数都建立类不变式,则可以保证这些不变式

  • 问题内容: 我所知道的打印,我们可以使用,并且我们可以使用 ,但我们仍然可以使用打印它们。那么,如果我总是习惯于打印它们怎么办?如果我这样做会发生什么问题? 问题答案: 不会有什么不好的,但是动词指示软件包打印为数字(以10为底),动词表示使用可以覆盖的 默认 格式。 请参阅以下示例: 输出(在Go Playground上尝试): 使用动词时,程序包将检查该值是否实现接口(这是一个方法),如果是,

  • 问题内容: 在Python中,以下代码会产生错误: (错误是“ TypeError:无法连接’str’和’int’对象”)。 当Python解释器遇到这些类型的串联时,为什么为什么不自动尝试使用str()函数? 问题答案: 问题在于转换是模棱两可的,因为它意味着 字符串连接 和 数字加法 。以下问题同样有效: 为什么Python解释器在遇到这些类型的 添加* 时不自动尝试使用 int() 函数?