当前位置: 首页 > news >正文

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

相关文章:

  • 解决uniapp h5 本地代理实现跨域访问及如何配置开发环境
  • C语言笔记25 •顺序表介绍•
  • Ubuntu乌班图安装VIM文本编辑器工具
  • k8s解决java服务下载超时问题
  • lighttpd cgi不能重启
  • 【毕业设计】Django 校园二手交易平台(有源码+mysql数据)
  • 笔记-python map函数
  • 视频智能分析平台智能边缘分析一体机安防监控平台打手机检测算法工作原理介绍
  • 2024年旅游与经济发展国际会议(ICTED 2024)
  • 在WordPress上添加亚马逊联盟链接的三种方法
  • 网络安全筑基篇——SQL注入
  • 什么是粘性代理IP
  • Ubuntu 22.04.4 LTS openresty(Nginx) 通过Lua+Redis 实现动态封禁IP
  • 中介子方程二十八
  • Talking-Heads Attention
  • [PHP内核探索]PHP中的哈希表
  • java中的hashCode
  • java中具有继承关系的类及其对象初始化顺序
  • Linux Process Manage
  • Lsb图片隐写
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • 简单基于spring的redis配置(单机和集群模式)
  • 简单数学运算程序(不定期更新)
  • 前端技术周刊 2019-02-11 Serverless
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何实现 font-size 的响应式
  • 通过几道题目学习二叉搜索树
  • 小程序 setData 学问多
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在Mac OS X上安装 Ruby运行环境
  • 阿里云服务器如何修改远程端口?
  • #565. 查找之大编号
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (13)DroneCAN 适配器节点(一)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (day 12)JavaScript学习笔记(数组3)
  • (pycharm)安装python库函数Matplotlib步骤
  • (四)事件系统
  • (转)Sublime Text3配置Lua运行环境
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net 8.0 新的变化
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET CORE Aws S3 使用
  • .net core使用ef 6
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET委托:一个关于C#的睡前故事
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @Autowired @Resource @Qualifier的区别
  • @RestController注解的使用
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • []sim300 GPRS数据收发程序