【Python Cookbook】S02E12 字符串的连接及合并 ‘ ‘.join()

问题

如果我们想要将很多小的字符串合并成为一个大的字符串,怎么办?

解决方案

如果只是想连接一些字符串,一般使用 + 操作符即可。

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 系统开销与 临时结果内存开销 的综合抉择。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脚踏实地的大梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值