python字符串高效拼接

众所周知,为了使字符串的使用如整形等基本类型一样安全,无副作用,字符被限定为不可变对象,也就是说绝大部分对字符串的修改操作将会创建新的字符串对象,而不是返回原字符串,这就容易造成不断创建对象,申请内存的低效操作。在项目中,字符串拼接是一个高频场景,下面就让我们来看一看如何高效的拼接字符串。


方式一:通过 “ + ” 号拼接

不推荐

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'
发布了32 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42022528/article/details/103536995