Python中格式化字符串的方法总结

 更新时间:2024年10月31日 09:49:46   作者:仙草哥哥  
字符串格式化是一项常见且重要的操作,用于动态生成包含变量内容的字符串,本文为大家整理一些常用的格式化字符串方法,希望对大家有所帮助

字符串格式化

字符串格式化是一项常见且重要的操作,用于动态生成包含变量内容的字符串。关于字符串的格式化,在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格式化字符串的资料请关注脚本之家其它相关文章!

相关文章

  • python fabric使用笔记

    python fabric使用笔记

    这篇文章主要介绍了python fabric使用笔记,fabric是一款实现远程操作和部署强大工具,本文就给出了它的多个使用实例,需要的朋友可以参考下
    2015-05-05
  • Python多线程和队列操作实例

    Python多线程和队列操作实例

    这篇文章主要介绍了Python多线程和队列操作实例,本文直接给给实例代码,需要的朋友可以参考下
    2015-06-06
  • scipy稀疏数组dok_array的具体使用

    scipy稀疏数组dok_array的具体使用

    本文主要介绍了scipy稀疏数组dok_array的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python Tornado 实现SSE服务端主动推送方案

    Python Tornado 实现SSE服务端主动推送方案

    SSE是Server-Sent Events 的简称,是一种服务器端到客户端(浏览器)的单项消息推送,本文主要探索两个方面的实践一个是客户端发送请求,服务端的返回是分多次进行传输的,直到传输完成,这种情况下请求结束后,考虑关闭SSE,所以这种连接可以认为是暂时的,感兴趣的朋友一起看看吧
    2024-01-01
  • python实现AdaBoost算法的示例

    python实现AdaBoost算法的示例

    这篇文章主要介绍了python实现AdaBoost算法的示例,帮助大家更好的理解和了解机器学习算法,感兴趣的朋友可以了解下
    2020-10-10
  • Python一行代码实现生成和读取二维码

    Python一行代码实现生成和读取二维码

    二维码被称为快速响应码,可能看起来很简单,但它们能够存储大量数据。无论扫描二维码时包含多少数据,用户都可以立即访问信息。本文将用一行Python代码实现二维码的读取与生成,需要的可以参考一下
    2022-02-02
  • python 用正则表达式筛选文本信息的实例

    python 用正则表达式筛选文本信息的实例

    今天小编就为大家分享一篇python 用正则表达式筛选文本信息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 解决PyCharm IDE环境下,执行unittest不生成测试报告的问题

    解决PyCharm IDE环境下,执行unittest不生成测试报告的问题

    这篇文章主要介绍了解决PyCharm IDE环境下,执行unittest不生成测试报告的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 一文带你深度解密Python的字节码

    一文带你深度解密Python的字节码

    当我们想要执行一个 py 文件的时候,只需要在命令行中输入 python xxx.py 即可,但你有没有想过这背后的流程是怎样的呢?本文主要贺和大家来聊聊Python中的字节码,感兴趣的可以了解一下
    2022-12-12
  • 通过Python 获取Android设备信息的轻量级框架

    通过Python 获取Android设备信息的轻量级框架

    今天跟大家分享一下,如何通过Python实现一个轻量级的库来获取电脑上连接的Android设备信息,需要的朋友参考下吧
    2017-12-12

最新评论