Python中格式化字符串的方法总结
作者:仙草哥哥
字符串格式化
字符串格式化是一项常见且重要的操作,用于动态生成包含变量内容的字符串。关于字符串的格式化,在python的历史上,曾经存在多种格式化字符串的方式,因此,这可能带来困扰,一些人可能不清楚应该使用哪一种格式化方法,下面,我就进行一下详细的介绍。
当前推荐做法:f-string
毫无疑问,f-string是现在最适合的字符串格式化的方法,因此首先进行介绍。f-string最早引入自3.6,因此需要3.6以后版本的python可以使用。
使用方法: 在字符串前加上 f 或 F,并在花括号 {} 内填入变量或者表达式。
name = "sagegrass" age = 18 greeting = f"你好,我的名字是{name},我今年{age}岁,我去年{age - 1}岁" print(greeting)
在python3.8以后,加入了f-string调试支持,使用方法为在变量或者表达式以后添加=,从而同时输出名称和结果。
name = "sagegrass" print(f"{name=}") # 此时输出结果为name=sagegrass
历史做法
%格式化
历史做法是在以前版本的python中非常常见的做法,你可以在很多较早期的代码中看见,并且,时至今日也并非完全没有使用价值,一些人可能现在仍然这样做(但最好应该改为使用f-string)。
%格式化是python中最早的字符串格式化方法,已经有几十年的历史了,最早从c语言中继承过来的。
使用方法: "格式字符串" % 值
name = "sagegrass" age = 18 greeting = "你好,我的名字是%s,我今年%d岁,我去年%d岁" % (name, age, age - 1) print(greeting)
其中,%s用于字符串,%d用于整型,另外还有一个常用的是%f,用于浮点数的格式化。但是由于其较为古老,既不好用,也容易出现问题,因此现在已经不建议使用了。
format格式化
format格式化是在python2.6以及3.0时期引入的,format提供了更强大和灵活的字符串格式化功能。
使用方法:"格式字符串".format(值1, 值2, ...)
p1 = "锄禾" p2 = "当午" p3 = "汗滴" p4 = "下土" poem = "{}日{},{}禾{}".format(p1, p2, p3, p4) print(poem)
format格式化还允许提供位置参数,多次使用同一个变量。
p1 = "一寸" p2 = "光阴" p3 = "金" poem = "{0}{1}{0}{2},寸{2}难买寸{1}".format(p1, p2, p3) print(poem)
format格式化还允许提供关键字参数,根据指定参数名使用。
name = "sagegrass" age = 18 greeting = "你好,我的名字是{name},我今年{age}岁,我去年{age_of_last_year}岁".format(name=name, age=age, age_of_last_year=age - 1) print(greeting)
与%格式化字符串不同,format至今仍然是一个非常不错的选择,甚至在某些语言中,最新引入的格式化字符串的方式,就是类似format的方式。
Template格式化字符串
这是一个好的格式化字符串的方式,但是较少使用,这可能与其来自于string模块,而不可以直接使用有一些关系。
from string import Template name = "sagegrass" age = 18 template = Template("你好,我的名字是$name,我今年$age岁,我去年$age_of_last_year岁") greeting = template.substitute(name=name, age=age, age_of_last_year=age - 1) print(greeting)
如果使用safe_substitute,那么在缺少变量的时候,也不会抛出异常,此时将保留原文
from string import Template name = "sagegrass" age = 18 template = Template("你好,我的名字是$name,我今年$age岁,我去年$age_of_last_year岁") greeting = template.safe_substitute(name=name) print(greeting) # 你好,我的名字是sagegrass,我今年$age岁,我去年$age_of_last_year岁
不常用做法
字符串拼接
还有一些做法,不是很好,如非特殊情况,不应该作为一个字符串格式化的方法,下面简单的介绍,但是实际使用中应该小心谨慎。
字符串拼接是通过例如+运算符,将多个字符串拼接为一个,它确实可以动态的生成字符串,不过其实不算是一个格式化字符串的方式。
name = "sagegrass" age = 18 greeting = "你好,我的名字是" + name + ",我今年" + str(age) +"岁,我去年" + str(age - 1) + "岁" print(greeting)
这种方式确实简单易懂,但是缺点在于性能低下,且难以读懂(尤其是在拼接字符串的数量变多的情况下)
str.join()连接
join()其实也不是用于进行字符串格式化的,它通常用于一些其他的功能。它起到了和字符串拼接相似的功能,但是性能通常却更好一点,理论上是字符串拼接的上位替代,但是仍然不建议这样做。
name = "sagegrass" age = 18 greeting = "".join(("你好,我的名字是", name, ",我今年", str(age), "岁,我去年", str(age - 1), "岁")) print(greeting)
自定义字符串格式化
只有非常特殊的需求才可能这样做,一般情况下,这其实比较奇怪。
import re def my_format(template, **kwargs): return re.sub(r'\{(\w+)\}', lambda match: str(kwargs.get(match.group(1), match.group(0))), template) name = "sagegrass" age = 18 greeting = my_format("你好,我的名字是{name},我今年{age}岁,我去年{age_of_last_year}岁", name=name, age=age, age_of_last_year=age - 1) print(greeting)
缺点包括自定义可能产生一些错误,或者是性能问题,好处在于可以按照自己的想法自定义格式化字符串的方法,并且添加一些需要的额外功能。
总结
2024年都快过完了,再有几个月就是2025年了,对于新的代码,目前(截止python3.12)应该尽可能使用f-string,这在过去可能是一个问题,因为前几年,可能还有非常多的人在使用python3.5,这个版本没有f-string功能,但是时至今日,3.7都已经很罕见了,f-string的使用也不再是一个“版本”问题了。
以上就是Python中格式化字符串的方法总结的详细内容,更多关于Python格式化字符串的资料请关注脚本之家其它相关文章!