Python拼接字符串的7种方式详解
忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。
几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来学习Python拼接字符串的七种方式。
1、来自C语言的%方式
print('%s%s'%('Hello','world')) >>>Helloworld
%号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的%号后面,放在一个元组里。
类似的占位符还有:%d(代表一个整数)、%f(代表一个浮点数)、%x(代表一个16进制数),等等。%占位符既是这种拼接方式的特点,同时也是其限制,因为每种占位符都有特定意义,实际使用起来太麻烦了。
2、format()拼接方式
#简洁版 s1='Hello{}!Mynameis{}.'.format('World','Python猫') print(s1) >>>HelloWorld!MynameisPython猫. #对号入座版 s2='Hello{0}!Mynameis{1}.'.format('World','Python猫') s3='Hello{name1}!Mynameis{name2}.'.format(name1='World',name2='Python猫') print(s2) >>>HelloWorld!MynameisPython猫. print(s3) >>>HelloWorld!MynameisPython猫.
这种方式使用花括号{}做占位符,在format方法中再转入实际的拼接值。容易看出,它实际上是对%号拼接方式的改进。这种方式在Python2.6中开始引入。
上例中,简洁版的花括号中无内容,缺点是容易弄错次序。对号入座版主要有两种,一种传入序列号,一种则使用key-value的方式。实战中,我们更推荐后一种,既不会数错次序,又更直观可读。
3、()类似元组方式
s_tuple=('Hello','','world') s_like_tuple=('Hello''''world') print(s_tuple) >>>('Hello','','world') print(s_like_tuple) >>>Helloworld type(s_like_tuple)>>>str
注意,上例中s_like_tuple并不是一个元组,因为元素间没有逗号分隔符,这些元素间可以用空格间隔,也可以不要空格。使用type()查看,发现它就是一个str类型。我没查到这是啥原因,猜测或许()括号中的内容是被Python优化处理了。
这种方式看起来很快捷,但是,括号()内要求元素是真实字符串,不能混用变量,所以不够灵活。
#多元素时,不支持有变量 str_1='Hello' str_2=(str_1'world') >>>SyntaxError:invalidsyntax str_3=(str_1str_1) >>>SyntaxError:invalidsyntax #但是下面写法不会报错 str_4=(str_1)
4、面向对象模板拼接
fromstringimportTemplate s=Template('${s1}${s2}!') print(s.safe_substitute(s1='Hello',s2='world')) >>>Helloworld!
说实话,我不喜欢这种实现方式。浓浓的一股被面向对象思想毒害的臭味。
就不多说了。
5、常用的+号方式
str_1='Helloworld!' str_2='MynameisPython猫.' print(str_1+str_2) >>>Helloworld!MynameisPython猫. print(str_1) >>>Helloworld!
这种方式最常用、直观、易懂,是入门级的实现方式。但是,它也存在两处让人容易犯错的地方。
首先,新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。
其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。
事实上,在拼接短的字面值时,由于CPython中的常数折叠(constantfolding)功能,这些字面值会被转换成更短的形式,例如'a'+'b'+'c'被转换成'abc','hello'+'world'也会被转换成'helloworld'。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。
常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。
题外话:你是否觉得20这个数字很熟悉呢?没错,字符串类的特权种族也是以20为限。当时也有一个例子,展示了编译期和运行期的区别,建议你去回看。
6、join()拼接方式
str_list=['Hello','world'] str_join1=''.join(str_list) str_join2='-'.join(str_list) print(str_join1)>>>Helloworld print(str_join2)>>>Hello-world
str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。
当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。
7、f-string方式
name='world' myname='python_cat' words=f'Hello{name}.Mynameis{myname}.' print(words) >>>Helloworld.Mynameispython_cat.
f-string方式出自PEP498(LiteralStringInterpolation,字面字符串插值),从Python3.6版本引入。其特点是在字符串前加f标识,字符串中间则用花括号{}包裹其它字符串变量。
这种方式在可读性上秒杀format()方式,处理长字符串的拼接时,速度与join()方法相当。
尽管如此,这种方式与其它某些编程语言相比,还是欠优雅,因为它引入了一个f标识。而其它某些程序语言可以更简练,比如shell:
name="world" myname="python_cat" words="Hello${name}.Mynameis${myname}." echo$words >>>Helloworld.Mynameispython_cat.
总结一下,我们前面说的“字符串拼接”,其实是从结果上理解。若从实现原理上划分的话,我们可以将这些方法划分出三种类型:
格式化类:%、format()、template
拼接类:+、()、join()
插值类:f-string
当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。
Python字符串拼接:方法、效率、场景
一般对于Python字符串拼接来讲,方法有以下三种:
方法一:通过“+”号拼接
因python中的字符串是不可变的类型,所以使用"+"号链接会生成一个新字符串,同时也重新申请了一段内存。
所以当拼接次数太多,使用"+"号拼接效率是非常低的。
contact='命运'+'先知'
print(contact)
结果:命运先知
方法二:格式化方式拼接
format()方法是pyhton最未推荐的字符串格式化的方法。
python2.6之前,格式化字符串都是用%的方式,原理与format()相同。
format函数可以接受不限个参数,位置可以通过{}中的下标索引任意设置。
format函数中的{}中还有很多功能,比如{:.of}表示不带小数,{:0>2d}表示向数字左边填补0,宽度为2。
contact= '{1}{0}'.format('命运','先知')
print(contact)
结果:先知命运
contact= '%s%s'%('命运','先知')
print(contact)
结果:命运先知
方法三 :join方式拼接 效率最高
使用略微复杂,但对于多个字符串进行拼接时,效率很高,只会有一次内存的申请。所以很擅长对列表的处理。
liststr=['命运','先知']
contact= ''.join(liststr)
print(contact)
结果:命运先知
更多关于Python字符串操作方法请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。