Python 的字符串格式化 format 函数语法

Python 有很多种字符串格式化方法,format()只是其中一种,在我看来它也非常的强大。

f-strings

再说format之前,先介绍一下f-strings

Python 3.6 新增了f-strings的支持。使用f前缀标志,解释器解析大括号内的字段或表达式,在上下文名字空间内寻找同名对象进行值替换。

格式化控制依旧遵循 format 规范,但在阅读体验上更加完整和简洁。

1
2
3
4
5
6
7
8
9
10
11
12
13
In [91]: x = 10
In [92]: y = 10
In [93]: f"{x} + {y} = {x + y}" # f-strings
Out[93]: '10 + 10 = 20'
In [94]: "{} + {} = {}".format(x, y, x + y) # format
Out[94]: '10 + 10 = 20'
# 除了运算符外,还支持函数调用
In [95]: f"{type(x)}"
Out[95]: "<class 'int'>"

所以,从某种角度上来看,f-strings有点像format的增强语法糖。

format 操作

format的格式化操作有很多,这里只介绍部分。

:是格式限定符,后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充。

手工序号和自动序号

1
2
3
4
5
In [96]: "{0} {1} {0}".format('a', 10)
Out[96]: 'a 10 a'
In [97]: "{} {}".format('hello', 'world')
Out[97]: 'hello world'

关键字参数

1
2
In [99]: "{name} {age}".format(name='buzz', age=20)
Out[99]: 'buzz 20'

属性和索引

1
2
3
4
5
6
7
8
9
10
11
12
13
In [100]: class X:
...: pass
...:
In [101]: x = X()
In [102]: x.name = "buzz"
In [103]: "{0.name}".format(x)
Out[103]: 'buzz'
In [104]: "{0[2]}".format([1, 2, 3, 4])
Out[104]: '3'

宽度、补位

主要就是进制,b、d、o、x 分别是二进制、十进制、八进制、十六进制。

1
2
3
4
5
6
7
8
In [105]: "{0:08b}".format(5)
Out[105]: '00000101'
In [108]: "{0:#08b}".format(5)
Out[108]: '0b000101'
In [109]: "{0:#07b}".format(5)
Out[109]: '0b00101'

数字

1
2
3
4
5
6
7
8
9
10
11
In [110]: "{:06.2f}".format(1.234)
Out[110]: '001.23'
In [111]: "{:08.2f}".format(1.234)
Out[111]: '00001.23'
In [113]: "{:18.2f}".format(1.234)
Out[113]: ' 1.23'
In [114]: "{:,}".format(123456789) # 千分位
Out[114]: '123,456,789'

其中.2表示长度为 2 的精度,f表示 float 类型。

对齐

填充常跟对齐一起使用。

^<>分别是居中、左对齐、右对齐,后面带宽度。

1
2
3
4
5
In [115]: "[{:^10}]".format('abc') # 居中
Out[115]: '[ abc ]'
In [116]: "[{:.<10}]".format('abc') # 左对齐,以 . 填充
Out[116]: '[abc.......]'