你所不知道的Python | 字符串连接的秘密

字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失。

方法1:加号连接

很多语言都支持使用加号连接字符串,Python也不例外,只需要简单的将2个或多个字符串相加就可以完成拼接。

1a = 'Python'
2b = '私房菜'
3r = a + b  # 输出'Python私房菜'

方法2:使用%操作符

在Python 2.6以前,%操作符是唯一一种格式化字符串的方法,它也可以用于连接字符串。

1a = 'Python'
2b = '私房菜'
3r = '%s%s' % (a, b)  # 输出'Python私房菜'

方法3:使用format方法

format方法是Python 2.6中出现的一种代替%操作符的字符串格式化方法,同样可以用来连接字符串。

1a = 'Python'
2b = '私房菜'
3r = '{}{}'.format(a, b)

方法4:使用f-string

Python 3.6中引入了Formatted String Literals(字面量格式化字符串),简称f-string,f-string是%操作符和format方法的进化版,使用f-string连接字符串的方法和使用%操作符、format方法类似。

1a = 'Python'
2b = '私房菜'
3r = f'{a}{b}'

方法5:使用str.join()方法

format方法是Python 2.6中出现的一种代替%操作符的字符串格式化方法,同样可以用来连接字符串。

1a = 'Python' 
2b = '私房菜'
3r = ''.join([a, b])

对比测试

既然连接字符串有这么多方法,那么使用时到底选择哪种呢?我们从代码可读性和性能两个层面来评估一下上面5种方法。

使用timeit模块,分别执行上述5种方法的示例代码100000次,执行时间如图。

可以看到,%操作符、format和f-string都是字符串格式化方法,性能依次递增,加号连接的性能和f-string不相上下。

有一点需要注意的是,字符串类型是不可变的,所以每一次应用加号连接字符串都会生成一个新的字符串,连接多个字符串时,效率低下就是必然的了,我们将一次连接的字符串提升到10个和20个,再来进行2轮测试,下面是连接20个字符串时的耗时情况。

和连接两个字符串时的结果出现了一些不同,首先使用加号连接的方式在字符串数量较多时(大于10个),性能会急剧下降,str.join()方法在连接大量字符串时性能最好。

总结

连接少量字符串时

使用加号连接符在性能和可读性上都是明智的,如果对可读性有更高的要求,并且使用的Python 3.6以上版本,f-string也是一个非常好的选择,例如下面这种情况,f-string的可读性显然比加号连接好得多。

1a = f'姓名:{name} 年龄:{age} 性别:{gender}'
2b = '姓名:' + name + '年龄:' + age + '性别:' + gender

连接大量字符串时

joinf-string都是性能最好的选择,选择时依然取决于你使用的Python版本以及对可读性的要求,f-string在连接大量字符串时可读性并不一定好。切记不要使用加号连接,尤其是在for循环中。

原文发布于微信公众号 - Python私房菜(python-fans)

原文发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏py+selenium

python爬虫笔记之re.match匹配,与search、findall区别

网上的定义【 从要匹配的字符串的头部开始,当匹配到string的尾部还没有匹配结束时,返回None;  当匹配过程中出现了无法匹配的字母,返回None。】 

1.2K3
来自专栏用户2442861的专栏

STL源码剖析-hash_map / hash_multimap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1214
来自专栏Python爱好者

Android面试之Java基础

1313
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(三十三) ——Redis排序命令sort的实现

《Redis设计与实现》读书笔记(三十三) ——Redis排序命令sort的实现 (原创内容,转载请注明来源,谢谢) 一、基本功能 redis的sort命令,可...

3895
来自专栏我是攻城师

在Scala里面如何使用元组

3594
来自专栏用户2442861的专栏

Python yield 使用浅析

您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?

851
来自专栏北京马哥教育

Python 面试问答 Top 25

Python 是一种解释型,交互式,面向对象的高级编程语言。和别的一些使用标点符号的语言不同,Python使用了大量的英语单词作为关键字,因而具有很好的可读性...

3526
来自专栏Python专栏

Python 面试问答 Top 25

Python 是一种解释型,交互式,面向对象的高级编程语言。和别的一些使用标点符号的语言不同,Python使用了大量的英语单词作为关键字,因而具有很好的可读性。...

1083
来自专栏康怀帅的专栏

PHP 编码规范

PHP 编码规范。 关键字必须小写 true, false, null。 类 类的 属性 和 方法 必须添加访问修饰符(private、protected 以及...

2993
来自专栏web前端教室

【学习笔记】先行者课程0109-rotate3d_变量、堆、栈

一,通过一个小例子,来学习一下css3 3d变换; 二,开始讲js,先从js变量开始说起, 说一下js的变量与内存中的栈的关系, 还有数据的“值传递”、“引...

1926

扫码关注云+社区

领取腾讯云代金券