Python拼接字符串的7种方法

czsay 2020-05-07

 python拼接字符串一般有以下几种方法:

1,通过(%)操作符拼接

print(‘%s %s‘ % (‘Hello‘, ‘world‘))
>>> Hello world

2,直接通过(+)操作符拼接

str_1 = ‘Hello world! ‘
str_2 = ‘My name is Python.‘
print(str_1 + str_2)
>>>Hello world! My name is Python.
print(str_1)
>>>Hello world!

使用这种方式进行字符串连接的操作效率低下,因为python中使用 + 拼接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当拼接字符串较多时自然会影响效率。

这种方式最常用、直观、易懂,是入门级的实现方式。但是,它也存在两处让人容易犯错的地方。
 
首先,新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。
 
其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。
 
事实上,在拼接短的字面值时,由于CPython中的 常数折叠 (constant folding)功能,这些字面值会被转换成更短的形式,例如‘a‘+‘b‘+‘c‘ 被转换成‘abc‘,‘hello‘+‘world‘也会被转换成‘hello world‘。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。
 
常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。
 
题外话:你是否觉得20这个数字很熟悉呢?没错,我们之前在《Python中的“特权种族”是什么?》中提到过,字符串类的特权种族也是以20为限。当时也有一个例子,展示了编译期和运行期的区别,建议你去回看。

小知识

3,join()拼接方式

 join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串

strlist=[‘Hello‘,‘ ‘,‘World‘,‘!‘]
>>>print(‘‘.join(strlist))

str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。

当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。

这种方式一般常使用在将集合转化为字符串,”.join()其中”可以是空字符,也可以是任意其他字符,当是任意其他字符时,集合中字符串会被该字符隔开,例如:

?strlist=[‘Hello‘,‘ ‘,‘World‘,‘!‘]
>>>print(‘,‘.join(strlist))

4,format()拼接方式

s=‘{} {}!‘.format(‘Hello‘,‘World‘) >>>print(s)

这种方式使用花括号{}做占位符,在format方法中再转入实际的拼接值。与%号拼接方式基本一致,特别注意{}的数量要和format方法参数数量一致,否则会报错

还有一种可以使用key-value的方式,直观可读,不容易出错次序

str1 = ‘Hello {0}! My name is {1}.‘.format(‘World‘, ‘Jack‘)
str2 = ‘Hello {name1}! My name is {name2}.‘.format(name1=‘World‘,name2=‘Jack‘)
print(str1)
>>>Hello World! My name is Jack.
print(str2)
>>>Hello World! My name is Jack.

 5,() 类似元组方式

s_tuple = (‘Hello‘, ‘ ‘, ‘world‘)
s_like_tuple = (‘Hello‘ ‘ ‘ ‘world‘) 
print(s_tuple) 
>>>(‘Hello‘, ‘ ‘, ‘world‘)
print(s_like_tuple) 
>>>Hello world 
type(s_like_tuple) 
>>>str

注意,上例中s_like_tuple并不是一个元组,因为元素间没有逗号分隔符,这些元素间可以用空格间隔,也可以不要空格。使用type()查看,发现它就是一个str类型。括号()内要求元素是真实字符串,不能混用变量

多行拼接

s = (
    ‘Hello‘
    ‘ ‘
    ‘World‘
    ‘!‘
)
print(s)
>>>Hello World!

6,通过string模块中的Template对象拼接

from string import Template
s = Template(‘${s1} ${s2}!‘) 
print(s.safe_substitute(s1=‘Hello‘,s2=‘World‘)) 
>>>Hello World!

Template的实现方式是首先通过Template初始化一个字符串。这些字符串中包含了一个个key。通过调用substitute或safe_subsititute,将key值与方法中传递过来的参数对应上,从而实现在指定的位置导入字符串。这种方式的好处是不需要担心参数不一致引发异常,如:

from string import Template
s = Template(‘${s1} ${s2} ${s3}!‘) 
print(s.safe_substitute(s1=‘Hello‘,s2=‘World‘)) 
>>>Hello World ${s3}!

7,通过F-strings拼接

在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”(Literal String Interpolation,字面字符串插值)或者更常见的一种称呼是**F-strings,**F-strings提供了一种明确且方便的方式将python表达式嵌入到字符串中来进行格式化:

s1=‘Hello‘
s2=‘World‘
print(f‘{s1} {s2}!‘)
>>>Hello World!

在F-strings中我们也可以执行函数:

def power(x):
    return x*x
x=4
print(f‘{x} * {x} = {power(x)}‘)
>>>4 * 4 = 16

F-strings这种方式的运行速度很快,比%-string和str.format()这两种格式化方法都快得多。

总结

格式化类:%、format()、template

拼接类:+、()、join()

插值类:f-string

当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。

相关推荐