目录
- 问题
- 解决方案
- 讨论
问题
如果我们想要将很多小的字符串合并成为一个大的字符串,怎么办?
解决方案
如果只是想连接一些字符串,一般使用 +
操作符即可。
a = "is Chicago"
b = "not Chicago"
print(a + " " + b)
结果:
is Chicago not Chicago
针对稍微复杂一点的,+
可以被 format()
代替
print("{} {}".format(a, b))
而如果想要合并的字符串在一个序列或者可迭代对象中,那么更为快速的合并方法,请选择 join()
方法。
parts = ["is", "Chicago", "not", "Chicago?"]
print(''.join(parts))
print(' '.join(parts))
对比下述结果,可得知为什么 join()
函数前为存空格:
isChicagonotChicago?
is Chicago not Chicago?
讨论
除了上述的三种场景,还有一种场景可能读者会经常遇到,即如果只是打算在源代码中将字符串字面值合并在一起,那么可以直接简单地将它们排列在一起即可。
a = "Hello" "World"
print(a)
其实本节虽然介绍了很多种方法,但是重点在于这些不同大的方法的选择。最重要的一点,是读者要意识到使用 +
操作符做大量的字符串连接是非常低效的,主要原因内存的拷贝以及垃圾的收集产生的影响。
s = ""
for p in parts:s += p
这种做法会比 .join()
方法慢上许多。具体原因,就是每一个 +=
操作符都需要创建一个新的字符串对象。对于需要连接的操作,建议读者最好先收集好所有要连接的部分,然后再选择高效的方法进行连接。
除了 .join()
方法外,还有一个不错的技巧,即 生成器表达式。
data = ["ACME", 50, 91.1]
print(','.join(str(d) for d in data))
此外,当字符串同输入输出 I/O 操作混合起来使用的时候,需要对应用做仔细的分析。如下两段代码中,最终实现的结果相同,但是需要根据字符串的大小因素以及 I/O 系统调用的开销进行选择。
# Version 1
f.write(chunk1 + chunk2)
# Version 2
f.write(chunk1)
f.write(chunk2)
仔细分析来看,有两种情况:
- 如果两个字符串都很小,那么第一个版本的代码能带来更好的性能,因为执行一次 I/O 系统调用的固有开销很高。
- 如果两个字符串都很大,那么第二个版本的代码会更加高效,因为第二个版本避免了创建大的临时结果,也没有对大块的内存进行拷贝。
所以综上,在选择方法时,要首先想清楚 I/O 系统开销与 临时结果内存开销 的综合抉择。