字符串替换的语法如下:
{[field_name] [!conversion] [:format_spec]}
主要切分为三部分:
- 字段选取
- 值转换
- 样式输出
1. 字段选取
字符选取对应替换语法中的field_name部分,具体语法如下:
field_name = arg_name (.attribute_name | [element_index])*
arg_name = [identifier | digit+]
attribute_name = identifier
element_index = digit+ | index_string
index_string = <any source character except "]"> +
选取方式分为三种:
1.1. 关键字选取
In [5]: name, age = ('小飞', 24)
In [6]: 'name: {name}, age: {age}'.format(name=name, age=age)
Out[6]: 'name: 小飞, age: 24'
In [7]: stu = {'name': name, 'age': age}
In [8]: 'name: {name}, age: {age}'.format(**stu) # 字典拆包
Out[8]: 'name: 小飞, age: 24'
1.2. 位置选取
In [14]: name, age = ('小飞', 24)
In [15]: 'name: {1}, age: {0}'.format(age, name)
Out[15]: 'name: 小飞, age: 24'
In [16]: 'name: {}, age: {}'.format(name, age) # 省略下标
Out[16]: 'name: 小飞, age: 24'
1.3. 嵌套选取
在通过了关键字或位置选取了字段之后,可进一步指定字段的属性或元素。
In [17]: class Student:
...: def __init__(self, stu_name, stu_age):
...: self.name = stu_name
...: self.age = stu_age
...: self.attr = (stu_name, stu_age)
...:
In [18]: stu = Student('小飞', 24)
In [19]: 'name: {stu.name}, age: {stu.age}'.format(stu=stu)
Out[19]: 'name: 小飞, age: 24'
In [20]: 'name: {0.name}, age: {0.age}'.format(stu)
Out[20]: 'name: 小飞, age: 24'
In [21]: 'name: {0.attr[0]}, age: {0.attr[1]}'.format(stu)
Out[21]: 'name: 小飞, age: 24'
2. 值转换
值转换对应替换语法中的conversion部分,取值有:
-
r
:对值调用str()方法 -
s
:对值调用repr()方法 -
a
:!a对值调用ascii()方法
In [22]: name, age = ('小飞', 24)
In [23]: 'name: {0!s}, age: {1!s}'.format(name, age)
Out[23]: 'name: 小飞, age: 24'
In [24]: 'name: {name!r}, age: {age!r}'.format(name=name, age=age)
Out[24]: "name: '小飞', age: 24"
In [25]: 'name: {!a}, age: {!a}'.format(name, age)
Out[25]: "name: '\\u5c0f\\u98de', age: 24"
3. 样式输出
样式输出对应替换语法的format_spec
部分,具体语法如下:
format_spec = [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill = <any character>
align = "<" | ">" | "=" | "^"
sign = "+" | "-" | " "
width = digit+
grouping_option = "_" | ","
precision = digit+
type = "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
3.1. 字宽
format_spec
语法中的width
对应字宽。
In [26]: '{:10}'.format(20)
Out[26]: ' 20'
3.2. 数值正负号
format_spec
语法中的sign
对应数值的正负号,取值有:
-
+
:正数加正,负数加负
In [32]: '{:+10}'.format(20)
Out[32]: ' +20'
In [33]: '{:+10}'.format(-20)
Out[33]: ' -20'
-
-
:正数不变,负数加负,默认
In [34]: '{:-10}'.format(+20)
Out[34]: ' 20'
In [35]: '{:-10}'.format(-20)
Out[35]: ' -20'
In [36]: '{:10}'.format(+20)
Out[36]: ' 20'
In [37]: '{:10}'.format(-20)
Out[37]: ' -20'
-
:正数空格,负数加负
In [38]: '{: 10}'.format(20)
Out[38]: ' 20'
In [39]: '{: 10}'.format(-20)
Out[39]: ' -20'
3.3. 对齐方式
format_spec
语法中的[fill]align
对应字符串的对齐方式,取值有:
-
<
:左对齐
In [40]: '{:<10}'.format(20)
Out[40]: '20 '
In [41]: '{:*<10}'.format(20) # *号填充
Out[41]: '20********'
-
>
:右对齐
In [42]: '{:>10}'.format(20)
Out[42]: ' 20'
In [43]: '{:10}'.format(-20) # 默认为右对齐,符号位放置填充物右侧
Out[43]: ' -20'
-
=
:右对齐,符号位放置填充物左侧,即:符号+填充物+数字
In [44]: '{:0=+10}'.format(20) #
Out[44]: '+000000020'
In [45]: '{:0=+10}'.format(-20)
Out[45]: '-000000020'
-
=
:右对齐,符号位放置填充物左侧,即:符号+填充物+数字
In [44]: '{:0=+10}'.format(20) #
Out[44]: '+000000020'
In [45]: '{:0=+10}'.format(-20)
Out[45]: '-000000020'
-
^
:居中
In [47]: '{:^10}'.format(20)
Out[47]: ' 20 '
In [48]: '{:*^10}'.format(20) # *号填充
Out[48]: '****20****'
3.4. 数据类型
format_spec
语法中的type
对应数据类型。
3.4.1. 字符串
当输入为字符串时,s
和None
均表示字符串
In [49]: '{:s}'.format('小飞')
Out[49]: '小飞'
In [50]: '{:}'.format('小飞')
Out[50]: '小飞'
3.4.1. 整型
当输入为整型时,type
可取的值有:
-
c
:输出整型对应的字符
In [51]: '{:c}'.format(65)
Out[51]: 'A'
-
b
:输出整型对应的二进制
In [52]: '{:b}'.format(20)
Out[52]: '10100'
-
o
:输出整型对应的八进制
In [53]: '{:o}'.format(20)
Out[53]: '24'
-
d
:输出整型对应的十进制
In [54]: '{:d}'.format(20)
Out[54]: '20'
-
x
:输出整型对应的十六进制,小写
In [55]: '{:x}'.format(26)
Out[55]: '1a'
-
X
:输出整型对应的十六进制,大写
In [56]: '{:X}'.format(26)
Out[56]: '1A'
-
None
:输出整型对应的十进制
In [57]: '{:}'.format(20)
Out[57]: '20'
3.4.2. 浮点数
当输入为浮点数时,type
可取的值有:
-
f
:输出对应的浮点数形式,默认保留6位小数,小写nan, inf
In [60]: '{:f}'.format(2.3333333333)
Out[60]: '2.333333'
In [61]: import math
In [62]: '{:f}'.format(math.nan)
Out[62]: 'nan'
-
F
:输出对应的浮点数形式,默认保留6位小数,大写NAN, INF
In [63]: '{:F}'.format(2.3333333333)
Out[63]: '2.333333'
In [64]: '{:F}'.format(math.inf) # 已导入math
Out[64]: 'INF'
-
e
:输出对应的科学计数形式,默认保留6位小数,小写e
In [65]: '{:e}'.format(2222.3333333333)
Out[65]: '2.222333e+03'
-
E
:输出对应的科学计数形式,默认保留6位小数,大写E
In [66]: '{:E}'.format(2222.3333333333)
Out[66]: '2.222333E+03'
-
g
:自动在f和e之间转换
In [67]: '{:g}'.format(2.3333333333)
Out[67]: '2.33333'
In [68]: '{:g}'.format(2222222.3333333333)
Out[68]: '2.22222e+06'
-
G
:自动在F和E之间转换
In [69]: '{:G}'.format(2.3333333333)
Out[69]: '2.33333'
In [70]: '{:G}'.format(2222222.3333333333)
Out[70]: '2.22222E+06'
-
%
:显示百分比
In [71]: '{:%}'.format(0.01)
Out[71]: '1.000000%'
In [72]: '{:.0%}'.format(0.01)
Out[72]: '1%'
3.5. 精度
In [73]: '{:.2f}'.format(0.0156)
Out[73]: '0.02'
附注:python3中可使用f'var: {var}'
。
图片发自简书