在csdn上读到,插值字符串格式化代码中有“!”,进行了一番探究,了解到其中的一点“隐秘”,在此共享。🤪
(笔记模板由python脚本于2024年03月31日 09:27:59创建,本篇笔记适合对Python字符串格式化有一定认知的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/137244773
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ f-string代码中的“!”
- 1、代码解析
- 2、`!`在f-string中的作用
- 2.1 通用模式:!a、!r、!s
- 2.2 数值类型的专属模式
- 2.3 对齐和嵌套模式组合
- 3、总结
- 4、我关于“字符串格式化”的笔记和练习
◆ f-string代码中的“!”
1、代码解析
我在csdn闲逛时,读到一行插值字符串格式化(f-string)代码中带了感叹号,给整不会了。🧐
代码
f'obj([{self.n!s}])'
一番探究,却发现“大有乾坤”,是我漏学的知识点,值得“笔记”一下。
!
是用于指定格式化选项的关键字, s
将所引用对象强制转换为其字符串表达形式。这通常用于确保所作用对象self.n
即使是非字符串类型也将会被强制转换为其字符串表示形式。
如:
pi = 3.1415926535
print(f"{pi!s}")
输出:3.1415926535
2、!
在f-string中的作用
在
P
y
t
h
o
n
Python
Python的格式化字符串字面值(f-strings
)中,!
用于指定格式化选项。它后面可以跟一个或多个字符,用于改变值的格式化方式。这些选项可以用来控制数字的显示方式、字符串的引用等。
2.1 通用模式:!a、!r、!s
以下是几个常用的格式化选项
:
!s
- 将值格式化为字符串。这通常用于确保即使是非字符串类型的值也会被强制转换为字符串表示形式。!r
- 将值转换为“官方”字符串表示形式,即使用repr()
函数。这通常会产生一个可以被Python解释器解析的字符串形式。!a
- 将值转换为“可打印”的ASCII表示形式。这类似于!r
,但是会使用ascii()
函数,确保所有非ASCII字符都被转换。
例如
:
class Example:
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
def __repr__(self):
return f"{self.value!r}"
obj = Example('梦幻精灵_cq')
print(f"\n!s参数:{obj!s}")
print(f"!r参数:{obj!r}")
print(f"!a参数:{obj!a}")
obj = Example(3.1415926535)
print(f"\n!s参数:{obj!s}")
print(f"!r参数:{obj!r}")
print(f"!a参数:{obj!a}")
obj = Example(True)
print(f"\n!s参数:{obj!s}")
print(f"!r参数:{obj!r}")
print(f"!a参数:{obj!a}")
obj = Example(['梦幻精灵_cq', 6688])
print(f"\n!s参数:{obj!s}")
print(f"!r参数:{obj!r}")
print(f"!a参数:{obj!a}")
代码运行效果截屏图片
由图可鉴,!a
参数对Ascii字符返回了它原本样子的 A S C I I ASCII ASCII码形态;对于非Ascii字符则返回了其 U n i c o d e Unicode Unicode编码(十六进制数)。
2.2 数值类型的专属模式
除了前面的例子中的任意对象都可使用的!s
、!r
和 !a
这些基本选项,还可以有对齐和填充字符串格式化操作。数值类型(int
、float
)对象,甚至还支持更多的格式化选项,允许你指定精度、宽度、填充字符等。例如:
小数位数(数度)和位宽控制
:
number = 123.456789
# 指定小数点后两位精度
print(f"The number is {number:.2f}") # 输出: The number is 123.46
# 指定宽度为8,左对齐
print(f"The number is {number:8}") # 输出: The number is 123.456789
在Python的字符串格式化中,你可以通过指定格式说明符来强制类型限定。格式说明符是一个由感叹号或者冒号(!
或者:
)引入的字符串,它跟随在格式化字段名之后,用于指定强制采用哪种模式格式化该对象。
以下是一些常用的类型限定关键字
01、s
- 将值转换为字符串形式。
02、r
- 将值转换为字符串形式,并使用repr()
而不是str()
。
03、a
- 将值转换为字符串形式,并使用ascii()
函数进行ASCII编码。
04、b
- 将整数转换为二进制表示形式。
05、d
- 将整数转换为十进制表示形式。
06、o
- 将整数转换为八进制表示形式。
07、x
- 将整数转换为十六进制表示形式,其中小写字母用于a-f。
08、X
- 将整数转换为十六进制表示形式,其中大写字母用于A-F。
09、e
- 将浮点数转换为科学计数法表示形式,其中小写字母e
用于指数部分。
10、E
- 将浮点数转换为科学计数法表示形式,其中大写字母E
用于指数部分。
11、f
- 将浮点数转换为固定点表示形式。
12、F
- 将浮点数转换为固定点表示形式,并且如果存在,使用大写字母表示NaN和无穷大。
13、g
- 自动选择在e
和f
之间更紧凑的表示形式来表示浮点数。
14、G
- 自动选择在E
和F
之间更紧凑的表示形式来表示浮点数。
15、c
- 将整数转换为对应的Unicode字符。
16、%
- 将数值转换为百分比表示形式,相当于乘以100并显示为一个固定点数,后面跟有一个百分号。
下面是16个参数的一些使用示例
:
obj = input('\n输入:\nobj = ').strip() # 变量obj接收键盘录入字符串。
objs = set(map(str, range(10)))
obj = int(obj) if set(obj).issubset(objs) else float(obj) if set(obj.replace('.', '')) <= objs else int(obj) if set(obj) <= set(range(10)) else obj # 用三元操作语句转换输入字符为相应类型。
print(f"\n{f'{type(obj) = }':^40}\n{'':~^40}\n\n◇ 使用新式字符串格式化:str.format()")
print("!a -> {!a}".format(obj))
print("!r -> {!r}".format(obj))
print("!s -> {!s}".format(obj))
if type(obj) is float or type(obj) is int:
print("\n:e -> {:e}".format(obj))
print(":E -> {:E}".format(obj))
print(":f -> {:f}".format(obj))
print(":F -> {:F}".format(obj))
print(":g -> {:g}".format(obj))
print(":G -> {:G}".format(obj))
print(":% -> {:%}".format(obj))
print(":.2% -> {:.2%}".format(obj))
if type(obj) is int:
print("\n:c -> {:c}".format(obj))
print(":d -> {:d}".format(obj))
print(":b -> {:b}".format(obj))
print(":o -> {:o}".format(obj))
print(":x -> {:x}".format(obj))
print(":X -> {:X}".format(obj))
print('\n\n◇ 使用插值字符串格式化:f-string')
print(f"!a -> {obj!a}")
print(f"!r -> {obj!r}")
print(f"!s -> {obj!s}")
if type(obj) is float or type(obj) is int:
print(f"\n:e -> {obj:e}")
print(f":E -> {obj:E}")
print(f":f -> {obj:f}")
print(f":F -> {obj:F}")
print(f":g -> {obj:g}")
print(f":.3G -> {obj:.3G}")
print(f":% -> {obj:%}")
print(f":.2% -> {obj:.2%}")
if type(obj) is int:
print(f"\n:b -> {int(obj):b}")
print(f":c -> {int(obj):c}")
print(f":d -> {int(obj):d}")
print(f":o -> {int(obj):o}")
print(f":x -> {int(obj):x}")
print(f":X -> {int(obj):X}")
print('\n\n◇ 使用占位符:%')
print('a -> %a'%obj)
print('r -> %r'%obj)
print('s -> %s'%obj)
if type(obj) is float or type(obj) is int:
print('\nd -> %d'%obj)
print('e -> %e'%obj)
print('E -> %E'%obj)
print('f -> %f'%obj)
print('F -> %F'%obj)
print('.2g -> %.2g'%obj)
print('.3G -> %.3G'%obj)
if type(obj) is int:
print('\nc -> %c'%int(obj))
print('o -> %o'%int(obj))
print('x -> %x'%int(obj))
print('X -> %X'%int(obj))
代码运行效果截屏图片
字符串 s t r str str
浮点数 f l o a t float float
整型 i n t int int
如图所鉴:在新式字符格式化和插值字符串格式化,参数的使用除a、 r、s
是由!
引导外,其它参数都是由:
引导的(a, r, s
可以对任意对象使用,其余只可以作用于数值型对象,其中b, c, d, o, x, X
只能作用于浮点型对象);旧式占位符%字符串格式化,则全部直接紧跟在作用对象后面,(其b
、%
参数不可用,d
参数可以直接作用于少浮点型数值对象float,自动截取整数部分,相当于'%d'%int(float)
)。
python 3.x已不推荐使用%
占位方式的旧式字符串格式化,但为了向下兼容代码,python 3.x还是对其提供支持的。虽然不在自己的代码中使用,对其“了解一下”还是必要的,方便对python 2.x相关代码的理解和阅读。
2.3 对齐和嵌套模式组合
在格式化字符串实际操作中,你可以自由地组合这些参数选项来得到你想要的输出格式。这些格式说明符提供了对字符串格式化的精细控制,使得创建格式化的输出变得非常灵活和强大。
(基于现在的
P
y
t
h
o
n
Python
Python最推崇f-string
,我也是对其极为
l
i
k
e
like
like,所以这里仅对“插值字符串格式化”举例阐述。如果欲了解“新式字符格式化”和“%占位符字符串格式化”,请点击这里跳转我以前的复习笔记)
f-string对齐操作
字符填充
不同行宽设定
我没有找到数值对象的模式控制和对齐操作同时共存的用法,但两层f-string
嵌套可以完美实现,代码语义也是易读易懂。如:
代码
int整型
float浮点型
Python代码
while 1:
obj = input('\n输入:\nobj = ').strip() # 变量obj接收键盘录入字符串。
if obj:
break # 有输入才继续,无输入循环。
objs = set(map(str, range(10)))
obj = int(obj) if set(obj).issubset(objs) else float(obj) if set(obj.replace('.', '')) <= objs else int(obj) if set(obj) <= set(range(10)) else obj # 用三元操作语句转换输入字符为相应类型。
print(f"\n\n◇ 使用插值字符串格式化:f-string\n{f' 在40的宽度中对齐 ':=^33}\n")
print(f":^40 居中,:<40 靠左 :>40 靠右\n{obj:^40}\n{obj:<40}\n{obj:>40}")
print(f"\n:~^40 “~”即是填充字符位,默认空格,后两行填充字符为“.”、“,”。\n{obj:~^40}\n{obj:.<40}\n{obj:,>40}")
print(f"\n参数末的数字,即是设定格式化字符行宽:\n:~^20 20宽度居中。\n{obj:~^20}\n:~<30 30宽度靠左\n{obj:~<30}\n:~>18 18宽度靠右\n{obj:~>18}\n{'清晰行占用宽度,用“~”字符填充':.^27}")
if type(obj) is float or type(obj) is int:
print(f'\n\n{"插值字符串嵌套对齐":=^30}\n{f":e -> {obj:e}":^40}')
print(f'{f":E -> {obj:E}":*>40}')
print(f'{f":f -> {obj:f}":^>33}')
print(f'{f":F -> {obj:F}":#<21}')
print(f"{f':g -> {obj:g}':a>24}")
print(f"{f':.3G -> {obj:.3G}':^40}")
print(f"{f':% -> {obj:%}':^19}")
print(f"{f':.2% -> {obj:.2%}':^40}")
if type(obj) is int:
print(f"\n{f':b -> {int(obj):b}':>36}")
print(f"{f':c -> {int(obj):c}':.^22}")
print(f"{f':d -> {int(obj):d}':@^33}")
print(f"{f':o -> {int(obj):o}':o<12}")
print(f"{f':x -> {int(obj):x}':x<16}")
print(f"{f':X -> {int(obj):X}':X^24}")
注意
:
如果对齐中有中文字符,代码中的宽度设定数值
,是实际行宽数值-中文字符数
。原因是,
P
y
t
h
o
n
Python
Python计算中文字符是按实际个数,而中文字符的显示却是占用两个英文
字符位。f-string
中的行宽数值是指的半角英文字符宽度。
没考虑中文的f-string对齐操作
由图可鉴,设定的对齐,被四个中文字符挤乱了。😁😁
- 中文对齐优化代码:
print(f"\n{'':~^40}\n\n{' 梦幻精灵_cq ':.^36}\n\n{'':~^40}")
输出:
减去四个中文字符,用 36 36 36限定行宽,就消除了四个中文字符的捣乱行为。😀
关于字符串的对齐还有其自带的方法:str.center()
, str.ljust()
, str.rjust()
。您可以点击这里
查看我以前的学习笔记。
3、总结
在Python 3.x中,推荐使用str.format()
方法和f-string
(
P
y
t
h
o
n
Python
Python 3.6+)进行字符串格式化,这些方法提供了更加强大和灵活的格式化能力。f-strings
通常是最快的方式,并且提供了最大的灵活性和易读性,因此通常是首选的字符串格式化方法。然而,对于Python 3.5及以下版本,str.format()
是更好的选择,而旧式字符串格式化通常不再推荐使用。
需要注意的是,在Python的新式字符串格式化方法中,!
并不是必须的,不加任何参数的缺省效果就是!s'。
!r’倒是与!s
没啥出入,!a
倒是比较巧妙,有时候比ascii()
方便。
我个人是更喜欢
P
y
t
h
o
n
3.6
Python 3.6
Python3.6极为推崇的插值字符串格式f-string
,她几乎就是自然语言,易读易写,撰写代码非常舒适。😋
4、我关于“字符串格式化”的笔记和练习
-
numpy和字符串格式化,用*画田字形状
-
str.replace()——Python的“第四”字符串格式
-
复习:python中的字符串格式化
-
插值字符串格式化定制程序结果输出(f‘{object}‘)
-
“文本界面”(Python插值字符串格式化打造)
上一篇: 代码行数的控制(Python)(同一段功能代码的行数,本应相对固定;但在灵活的Python中,她却是“变幻莫测”的)
下一篇:
我的HOT博:
本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有
7
7
7篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)