f-string,称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法,该方法源于PEP 498 – Literal String Interpolation,主要目的是使格式化字符串的操作更加简便。
python中常用有3种字符串格式化的方法:
其中f-string是推荐的最清晰,效率最高的方法。本篇主要讲解f-string常见的使用方法。
f-string采用content:format} 设置字符串格式,其中 content 是替换并填入字符串的内容,可以是变量、表达式、函数等,format 是格式描述符,可以省略。
Python f-string 格式化字符串的完整格式说明是通过冒号(:)后面的格式规范符来实现的。这个格式化规范符可以用来控制数字、字符串、时间日期等数据类型的输出格式。以下是完整的格式说明,包括常见的格式化选项及其用法。
1 |
f"{expression:{flags}{width}{precision}{type}}" |
简单使用
f-string用大括号 {} 表示被替换字段,其中直接填入替换内容:
1 2 3 4 5 6 7 8 9 10 11 |
>>> name = 'Eric' >>> f'Hello, my name is {name}' 'Hello, my name is Eric'
>>> number = 7 >>> f'My lucky number is {number}' 'My lucky number is 7'
>>> price = 19.99 >>> f'The price of this book is {price}' 'The price of this book is 19.99' |
注意:不管变量的类型是什么,最后都会得到字符串类型的结果
使用f-string最常见的就是控制变量精度和输出宽度
格式描述符 | 含义与作用 | |
---|---|---|
width | 整数 width 指定宽度 | 0width:整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度 |
width.precision | 整数 width 指定宽度,整数 precision 指定显示精度 |
以圆点为分割,圆点之前控制输出宽度,原点之后控制输出精度。
控制输出宽度,不管是数值类型和字符串类型都可以。语法:f"{变量: 宽度}"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>> a = 3.1415926 # 变量宽度9,指定宽度20,数值左补齐 >>> print(f"{a:20}") 3.1415926 >>> print(len(f"{a:20}")) 20
>>> c = "hello world"
>>> print(f"{c:5}") hello world
>>> print(f"{c:25}") hello world
# 变量只有11个字符串,指定宽度为25,输出长度为25,以空格补齐 >>> print(len(f"{c:25}")) 25 |
有一个特别使用f"{变量: 0宽度}",在宽度前面加0可以实现变量显示前面用0补齐
1 2 3 4 5 |
>>> a = 3.1415926
>>> print(f"{a:020}") 000000000003.1415926 >>> |
数值
整型和浮点数使用f-string可以控制输出的精度。语法是 f"{变量: .4f}",其中4f是指小数点后的位数,可以实现精度截断或扩充。其中截断的规则是四舍五入,扩充是将精度增加到指定位数
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> a = 3.1415926
>>> print(f"{a:.4f}") 3.1416
>>> b = 100
>>> print(f"{b}") '100'
>>> print(f"{b:.6f}") '100.000000' >>> |
字符串
字符串同样可以控制输出精度,使用语法** f"{变量:.4s}"**, 其中4s指字符串的长度,s可以省略,可以实现截断,但不会填充。设置的长度大于变量长度,输出仍然是变量的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
>>> c = "hello world"
>>> print(f"{c:.2}") he
>>> print(f"{c:.10s}") hello worl
>>> print(f"{c:.5s}") hello
# 精度超出长度不会填充 >>> print(f"{c:.20s}") hello world
>>> print(len(f"{c:.20s}")) 11 |
可以同时控制宽度和精度
1 2 3 4 5 6 7 |
>>> a = 3.1415926 >>> print(f"{a:14.4f}") 3.1416
>>> c = "hello world" >>> print(f"{c:25.4s}") hell |
对齐是指输出时当指定宽度大于变量宽度时如何显示,可以选择的包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>> c = "hello world"
# 设置宽度之后就会出现空格填充,字符串默认右填充即左对齐 >>> print(f"{c:20}") hello world
>>> print(len(f"{c:20}")) 20
>>> print(f"{c:<20}") hello world >>>
>>> print(f"{c:>20}") hello world
>>> print(f"{c:^20}") hello world |
在对齐时默认使用空格填充,也可以使用指定字符填充。使用语法 **f"{变量: 填充字符<宽度}" **,填充字符常见:-、+、*、0等等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>> c = "hello world"
>>> print(f"{c:<20}") hello world
>>> print(f"{c:-<20}") hello world---------
>>> print(f"{c:->20}") ---------hello world >>> >>> print(f"{c:-^20}") ----hello world-----
>>> print(f"{c:*^20}") ****hello world*****
>>> print(f"{c:0^20}") 0000hello world00000 |
类型标识符 (type) 类型标识符决定了如何表示和格式化数值、字符串等常见数据类型。常见的类型标识符包括:
数值转十进制
1 2 3 4 5 |
>>> value = 0xff >>> value 255 >>> print(f"{value:d}") 255 |
进制转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> a = 378297640000 >>>
# 10转2 >>> print(f"{a:b}") 101100000010100010010111110010001000000
# 10转8 >>> print(f"{a:d}") 378297640000
# 10转16 >>> print(f"{a:x}") 58144be440 |
默认不添加进制的前缀,使用# 可以添加
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> a = 378297640000
>>> print(f"{a:#b}") 0b101100000010100010010111110010001000000
>>> print(f"{a:#d}") 378297640000
>>> print(f"{a:#x}") 0x58144be440
>>> print(f"{a:#X}") 0X58144BE440 |
变量转浮点数
1 2 3 4 5 |
>>> value = 0xff
>>> print(f"{value:f}") 255.000000 >>> |
将整数转换为unicode编码对应字符
1 2 3 4 5 6 7 8 9 |
>>> a = 69 >>> print(f"{a:c}") E >>> a = 290 >>> print(f"{a:c}") ? >>> a = 2736 >>> print(f"{a:c}") ? |
科学计数法
1 2 3 4 5 6 7 8 9 |
>>> a = 378297640000 >>> >>> print(f"{a:e}") 3.782976e+11
>>> b = -0.132465 >>> >>> print(f"{b:e}") -1.324650e-01 |
百分号
将浮动点数乘以 100 并附加 % 符号
1 2 3 |
>>> a = 0.5473 >>> print(f"{a:%}") 54.730000% |
fstring 以通过结合 datetime 模块来实现时间的格式化。更多格式可自行查阅。
1 2 3 4 5 6 7 8 9 10 |
>>> from datetime import datetime >>> >>> now = datetime.now() >>> >>> now datetime.datetime(2025, 5, 15, 17, 42, 6, 490934) >>> formatted_time = f"{now:%Y-%m-%d %H:%M:%S}" >>> print(formatted_time) 2025-05-15 17:42:06 >>> |
浮点数填充到20位中间对齐保留2位小数点
1 2 3 4 |
>>> a = 3.1415926
???????>>> print(f"{a:-^20.2f}") --------3.14-------- |
整数填充到30位右对齐转换成十六进制
1 2 3 4 |
>>> a = 378297640000
???????>>> print(f"{a:+>30x}") ++++++++++++++++++++58144be440 |