众所周知,为了使字符串的使用如整形等基本类型一样安全,无副作用,字符被限定为不可变对象,也就是说绝大部分对字符串的修改操作将会创建新的字符串对象,而不是返回原字符串,这就容易造成不断创建对象,申请内存的低效操作。在项目中,字符串拼接是一个高频场景,下面就让我们来看一看如何高效的拼接字符串。
方式一:通过 “ + ” 号拼接
不推荐
str1 = "a"
str2 = "b"
str3 = "c"
print( str1 + str2 + str3 )
>>>"abc"
使用这种方式进行字符串连接的操作效率低下,因为python中使用 + 拼接两个字符串时会生成一个新的字符串
上诉 str1+str2+str3 执行过程解析成
>>> str1 + str2 + str3
temp = str1 + str2
final = temp + str3
生成新的字符串就需要重新申请内存,当拼接字符串较多时自然会影响效率。
方式二:格式化% 或者 format
推荐
str1 = "a"
str2 = "b"
str3 = "%s%s" % (str1,str2)
str4 = "{}{}".format(str1,str2)
#下面是for循环拼接一个字符串时候的使用
content = u""
for i in range(20):
content= u"{}{}".format(content,str(i))
这种方式不需要申请很多次内存,而是一次性完成,所以这种方法推荐首选
方式三:通过str.join()方法拼接
高效列表
list1 = ["1","2","3"]
str1 = "".join(list1)
# 注意:使用join的时候,列表里面的每一项都必须是str类型
# 否则会出错
# 比如:
list2 = ["1",2]
str2 = "".join(list2)
>>TypeError: sequence item 1: expected str instance, int found
使用略微复杂,但对于多个字符串进行拼接时,效率很高,只会有一次内存的申请。所以很擅长对列表的处理。
方式四: template方式
format升级
from string import Template
# ${} 设置变量占位符
temp1 = Template("${s1} 11 ${s2} 22 ${s3}")
str2 = temp1.safe_substitute(s1="hello",s2="world")
print(str2) # hello 11 world 22 ${s3}
str3 = temp1.safe_substitute(s1="hello",s2="world",s3="i'am comming")
print(str3) # hello 11 world 22 i'am comming
Template的实现方式是首先通过Template初始化一个字符串。这些字符串中包含了一个个key。通过调用substitute或safe_subsititute,将key值与方法中传递过来的参数对应上,从而实现在指定的位置导入字符串。
该效率是字符串格式化打印的进阶版,因为字符串打印 %、 {} 方式有可能会因为数量不够(占位符与参数个数不一致)而报错,如
from string import Template
s = Template('${s1} ${s2} ${s3}!')
s.safe_substitute(s1='Hello',s2='World')
>>>'Hello World ${s3}!'
方式五: 通过F-strings拼接
F-strings效率最高
在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是F-strings,F-strings提供了一种明确且方便的方式将python表达式嵌入到字符串中来进行格式化:
s1 = 'Hello'
s2 = 'World'
f'{s1} {s2}!'
>>>'Hello World!'
在F-strings中我们也可以执行函数:
def power(x):
return x*x
x = 5
f'{x} * {x} = {power(x)}'
>>> '5 * 5 = 25'