▒ 目录 ▒
- 🛫 问题
- 描述
- 环境
- 1️⃣ 《%》方式格式化
- 语法
- %后面的参数说明
- 2️⃣ str.format
- 优点
- 指定位置:参数可以不按顺序
- 关键字参数
- 列表索引
- 对象
- 数字格式化
- 3️⃣ f-string
- 语法
- 语法示例
- 格式化一个表达式
- 转义符号
- 格式化 datetime 对象
- 🛬 结论
- 📖 参考资料
🛫 问题
描述
作为开发语言中常见的功能
字符串格式
,python可谓是煞费苦心,从python2开始到目前,不断的增强字符串格式化的功能,今天就汇总一下。
环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2023-06-28 | |
操作系统 | Win11 - 21H2 - 22000.1335 | |
Python | 3.7.1 | |
frida.exe | 15.0.18 | |
1️⃣ 《%》方式格式化
《%》作为Python2.6 之前,格式化字符串的方式,它也是兼容所有版本的一种字符串格式化方法。
语法
Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
在 Python 中,字符串格式化使用与C语言
中sprintf
函数一样的语法。
python 字符串格式化符号
格式化操作符辅助指令
%后面的参数说明
参数一般以
元组
的形式传值。“xxxx %s %s” % (value, value2)
当只哟一个参数的时候,可以直接传参:"xxxx %s " % value
不过建议提供一个单元素元组,就像"xxxx %s " % (value,)
2️⃣ str.format
Python2.6 之后的,str增加了format函数,用于格式化字符串。
基本语法是通过{} 和 :
来代替以前的%
。
优点
- 在%方法中%s只能替代字符串类型,而在format中不需要理会数据类型;
- 单个参数可以多次输出,参数顺序可以不相同;
- 填充方式十分灵活,对齐方式十分强大;
- 官方推荐用的方式,%方式将会在后面的版本被淘汰。
指定位置:参数可以不按顺序
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
关键字参数
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
列表索引
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
对象
class AssignValue(object):
def __init__(self, value):
self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
数字格式化
>>> print("{:.2f}".format(3.1415926))
3.14
各种不同的格式如下图:
3️⃣ f-string
f-string是2015年python 3.6 根据PEP 498新添加的一种字符串格式化方法,f-string实际上是在运行时计算的表达式,而不是常量值。
和JavaScript等语言的语法很像。
语法
f-string采用
{content:format}
设置字符串格式。
content
是替换并填入字符串的内容
,可以是变量、表达式或函数等format
是格式描述符。采用默认格式时不必指定 {:format}- 如上面例子所示只写 {content} 即可
使用f-string格式化字符串十分简单。唯一的要求就是给它一个有效的表达式。f-string 也可以用大写F开头或者与 r 原始字符串结合使用。但是你不能将其与 b”” 或者 ”u” 混用。
关于这个format的格式,我们依然使用前面的方法二种format来格式化字符串的顺序来说明,也是按照下面这6个主要方面:
<填充><对齐><宽度><,><.精度><类型>6 个字段,但是还有所拓展
format_spec 格式: [[fill]align][sign][#][0][width][grouping_option][.precision][type]
即format一般的格式为
[填充字符][对齐方式][数字的正负号显示][#][0][宽度][千分位分组符号][.小数精度][类型]
(1)填充 fill : 可以是任何的字符
(2)对齐 align: "<" | ">" | "=" | "^"
(3)符号 sign : 这个仅仅对数值有效 "+" | "-" | " "
(4)宽度 width: 是一个整数数值,表示多少宽度
(5)grouping_option:表示千分位的分隔符号,可以是 "_" | ","
(6)精度 precision : .数字
(7)类型 type : "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
语法示例
>>> book = "The dog guide"
>>> num_pages = 124
>>> f"The book {book} has{num_pages} pages"
'The book The dog guide has 124 pages'
>>> F"The book {book} has{num_pages} pages"
'The book The dog guide has 124 pages'
>>> print(Fr"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(FR"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(f"The book {book} has{num_pages} pages\n")
The book The dog guide has 124 pages
格式化一个表达式
>>> f"4 * 4 is {4 * 4}"
'4 * 4 is 16'
>>> n = 4
>>> f"4 * 4 is {n * n}"
'4 * 4 is 16'
转义符号
>>> hello = "world"
>>>f"{{hello}} = {hello}"
'{hello} = world'
>>>f"{hello} = \"hello\""
'world = "hello"'
格式化 datetime 对象
F-string也支持datetime对象的格式化。其过程与str.format格式化日期的方法很近似。请查阅官方文档中的表格获取更多所支持格式的相关信息。
>>> import datetime
>>> now = datetime.datetime.now()
>>> ten_days_ago = now -datetime.timedelta(days=10)
>>> f'{ten_days_ago:%Y-%m-%d %H:%M:%S}'
'2020-10-13 20:24:17'
>>> f'{now:%Y-%m-%d %H:%M:%S}'
'2020-10-23 20:24:17'
🛬 结论
以上三种方案各有有缺,使用上小编剧认为需要注意一下几点:
%
方式:历史方案,使用不够灵活,除非特殊要求,避免使用。str.format
方式:已经足够强大,而且支持python版本很多,十分推荐
。f-string
方式:从3.6之后才开始使用,如果自己开发三方库,请勿使用,避免低版本无法使用的问题。
📖 参考资料
- 官网string文档 https://docs.python.org/3/library/string.html
- Python format 格式化函数 https://www.runoob.com/python/att-string-format.html
- python字符串格式化深入详解(四种方法) https://blog.csdn.net/qq_27825451/article/details/105652244
- 这有 73 个例子,彻底掌握 f-string 用法! https://blog.csdn.net/chinesehuazhou2/article/details/110016578