衆所周知,爲了使字符串的使用如整形等基本類型一樣安全,無副作用,字符被限定爲不可變對象,也就是說絕大部分對字符串的修改操作將會創建新的字符串對象,而不是返回原字符串,這就容易造成不斷創建對象,申請內存的低效操作。在項目中,字符串拼接是一個高頻場景,下面就讓我們來看一看如何高效的拼接字符串。
方式一:通過 “ + ” 號拼接
不推薦
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'