【Python】字符串格式化前世今生

🛫 问题

描述

作为开发语言中常见的功能字符串格式,python可谓是煞费苦心,从python2开始到目前,不断的增强字符串格式化的功能,今天就汇总一下。

环境

版本号描述
文章日期2023-06-28
操作系统Win11 - 21H2 - 22000.1335
Python3.7.1
frida.exe15.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函数,用于格式化字符串。
基本语法是通过 {} 和 : 来代替以前的%

优点

  1. 在%方法中%s只能替代字符串类型,而在format中不需要理会数据类型;
  2. 单个参数可以多次输出,参数顺序可以不相同;
  3. 填充方式十分灵活,对齐方式十分强大;
  4. 官方推荐用的方式,%方式将会在后面的版本被淘汰。

指定位置:参数可以不按顺序

>>>"{} {}".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之后才开始使用,如果自己开发三方库,请勿使用,避免低版本无法使用的问题。

📖 参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值