python字符串拼接的方式和性能对比

boyanx4周前技术教程9


在编程过程中,常会用到字符串拼接。python里字符串拼接主要有四种方式,分别是,使用加号,join方法,百分号或format字符串格式化,f-string。


其中,加号运算符无疑是最常用和最简单的字符串拼接方式,在多个字符串之间直接用加号就能连接起来。还有一些特殊点的使用方法,比如结合条件判断,可动态拼接字符串。


假设有个数字 a ,用 "is so " + ("good" if a > 0 else "bad") 这样就可以根据 a 不同的值来动态拼接出不同的字符串。


a = 5

result = "is so " + ("good" if a > 0 else "bad")

print(result)


用加号运算符进行拼接时,要注意两头都必须是个字符串,常见的错误是把字符串和数字拼接,这样运行一下就会报错,正确做法是要先把数字转成字符串再拼接。


num = 10

# 错误拼接方式,会报错

# error_result = "数字是:" + num

# 正确拼接方式

correct_result = "数字是:" + str(num)

print(correct_result)


百分号和format比较少用,这里就不介绍了。f-string我们前面有做过一个专门介绍的视频,有兴趣的朋友可以看下我们前面的视频。


这里我们重点介绍一下join方法。


join方法用于将可迭代对象中的元素连接成一个字符串。基本语法是:连接字符串.join(可迭代对象)


比如我们有个字符串列表 s = ["1", "2", "3", "4"] ,要拼接成字符串,直接用引号,点,join(s)就行。 如果要用其他字符串来连接,就在引号里写上其他字符串,比如可以加个下划线,把列表每个字符串元素用下划线连接起来。

join的参数只要是个以字符串为元素的可迭代对象就行,比如列表,元组,集合等都可以。当然也可以是一个字符串,因为字符串本身就是个可迭代对象,每个字符就是这个可迭代对象的元素。比如我们把参数换成一个字符串,这样就变成了用下划线把每个字符连接起来了。

使用join时要注意,可迭代对象里的每个元素都必须是字符串。否则会抛出 TypeError 异常。我们把 s 列表的一个参数换成数字看下,这样就会报错。示例代码如下:


s = ["1", "2", 3, "4"] # 把第三个元素换成数字

# 执行会报错

# error_result = "".join(s)

join也可以拼接集合的元素。但是由于集合是无序的,所以每次拼接得到的字符串可能会不同。

和加号运算符一样,我们还可以结合条件表达式进行动态拼接。比如 "_" if a > 0 else "/" ,然后 .join(s) ,这样, a 的值不同,就可以用不同的字符串进行拼接。

a = 10

s = ["1", "2", "3", "4"]

connect_str = "_" if a > 0 else "/"

dynamic_result = connect_str.join(s)

print(dynamic_result)

join结合切片等还可以实现单个数字的排序。


比如 s 是个数字。可以用 int("".join(sorted(str(s)))) 这个式子,把这个 s 的每一位数字按顺序排序。


这里 str(s) 是先把数字转成字符串,然后用 sorted 把字符串的每个字符排序。但这时返回的是个列表,所以要用 join 把列表拼接成字符串,再用 int 转成数字。

s = 132

sorted_num = int("".join(sorted(str(s))))

print(sorted_num)


在连接多个字符串时,用 join 来拼接,会比用加号更加高效。因为每次执行加号拼接操作时,都会创建一个新的字符串对象,然后再进行下一个加号拼接,这样会产生多次内存分配和复制操作,性能开销较大。而 join() 方法会预先计算好连接后字符串所需的内存空间,然后一次性分配内存并将各个字符串复制到新的字符串中,避免了多次创建新字符串带来的性能开销。


所以加号拼接更适合简单的、少量字符串的连接操作,而 join() 方法则更适用于各种可迭代对象中的字符串连接,尤其是在处理大量字符串连接,或者需要对可迭代对象中的元素进行统一连接操作的场景中,优势明显。

我们可以来做个简单的性能对比。

import timeit

s = ["abc"] * 1000

# 定义一个函数a,循环用加号拼接

def a():

result = ""

for i in s:

result += i

return result

# 再定义一个函数b,用join拼接

def b():

return "".join(s)

# 分别执行一万次,然后输出运行用时

print(timeit.timeit(a, number=10000))

print(timeit.timeit(b, number=10000))

可以看到,用 join 的运行时间要短很多。


好了,今天的视频就到这里。熟练掌握这些字符串拼接方式,能帮助我们编写出更高效、易读的Python代码,希望这个视频对你有帮助。

相关文章

让 Python 代码 “飞” 起来的实用技巧,你知道几个?

各位 Python 编程爱好者们!你们有没有过这样的经历,满心欢喜地写好代码,运行起来却发现速度慢得让人着急,心里别提多郁闷了。别担心,今天我就把珍藏已久的 9 个让 Python 代码效率飙升的技巧...

用Python进行机器学习(13)-图像特征提取

相对于前面的机器学习都是处理一些简单的数字,今天我们来用机器学习处理一点稍微高级的内容,我们进行图像的特征提取。图像的特征提取有很多的用途,比如图像分类、目标检测、图像检索、聚类分析、异常检测、图像生...

不会Python?1个视频教会你!#Python教程#大学生必看

Python零基础速通指南一、精选视频教程推荐(附学习路线)3小时语法速通核心章节:变量定义、条件判断、循环结构、函数封装(参考网易公开课《1-1.认识python》到《1-12.顺序选择循环》章节)...

深入详解Python的比较运算

在Python编程中,比较运算是构建逻辑判断的核心基础,无论是条件控制、数据筛选还是算法逻辑,都离不开对数据的比较操作。本文将从基础概念到高级应用,全面解析Python比较运算的细节,帮助开发者深入理...

别让这5个编程习惯毁了你的代码!AI检测工具帮你一键修复

——从“代码草莽”到“AI护法”的升级指南01 硬编码常量:埋下“隐形地雷”坏习惯表现:直接在代码中写入“魔改版”参数(如if (status == 999)),导致后期维护时“代码即天书”。AI修复...

在 MySQL 中使用 TINYINT 类型进行比较查询时,需要注意的事项

最近在项目中在表中新增了两个字段,使用的TINYINT(1)定义布尔类型,并且未设置默认值,这个字段是后来新增,新增之后没有对以前的历史数据进行处理,于是在代码中比较的时候,使用了如下示例代码:Lis...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。