背景

Pyton用了一段时间了,对字符串的格式化最多用的就是"%s" % var,最多,多加几个参数,或者加个str()处理一下。一直美誉深究,能用就好。 前段时间刚好做了一个测试,想把字符串安装特定的格式输出,这样看过程更加方便点。

Format方式格式化

简单使用

基本用法是 “字符串模版”.format(<逗号分隔的参数>)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 默认顺序
'{}{}'.format(‘编码’,‘生活’)
# out: 编码生活

# 指定顺序复用
'一时{0}一时{1}, 一直{0}一直{1}'.format('偷懒','爽')
# out: '一时偷懒一时爽, 一直偷懒一直爽'


# 大括号的输出
'我们来用{0}{{}}{0}{{}},{1}{{}}{1}{{}}造句'.format('一时','一直')
#out: '我们来用一时{}一时{},一直{}一直{}造句'
'我们来用{0}{{0}}{0}{{1}},{1}{{0}}{1}{{1}}造句'.format('一时','一直')
#out: '我们来用一时{0}一时{1},一直{0}一直{1}造句'
'我们来用{0}{{0}}{0}{{1}},{1}{{0}}{1}{{1}}造句'.format('一时','一直').format('偷懒','爽')
#out: '我们来用一时偷懒一时爽,一直偷懒一直爽造句'

格式控制信息

format()方法中<模板字符串>的槽除了包括参数序号,还可以包括格式控制信息。此时,槽的内部样式如下:
 {<参数序号>: <格式控制标记>} 其中,<格式控制标记>用来控制参数显示时的格式,包括:<填充><对齐><宽度>,<.精度><类型>6 个字段,这些字段都是可选的,可以组合使用,逐一介绍如下。

<填充> <对齐> <宽度> , <.精度> <类别>
用于填充的单个字符 < 左对齐, > 右对齐, ^ 居中对齐 槽的设定,输出宽度 数字的千位分隔符,适用于整数和浮点数 浮点数小数部或字符串最大输出长度 整数类型BcdoXx,浮点数类型Eef%
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

s = "PYTHON"

"{0:30}".format(s)
# out: 'PYTHON                        '

"{0:>30}".format(s)
# out: '                        PYTHON'

"{0:*^30}".format(s)
# out: '************PYTHON************'

"{0:-^30}".format(s)
# out: '------------PYTHON------------'

"{0:3}".format(s)
# out: 'PYTHON'



"{0:-^20,}".format(1234567890)
# out: '---1,234,567,890----'

"{0:-^20}".format(1234567890) #对比输出
# out: '-----1234567890-----'

"{0:-^20,}".format(12345.67890)
# out: '----12,345.6789-----'


"{0:.2f}".format(12345.67890)
# out: '12345.68'

"{0:H^20.3f}".format(12345.67890)
# out: 'HHHHH12345.679HHHHHH'

"{0:.4}".format("PYTHON")
# out: 'PYTH'



"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(251)
# out: '11111011,û,251,373,fb,FB'

"{0:e},{0:E},{0:f},{0:%}".format(3.14)
# out: '3.140000e+00,3.140000E+00,3.140000,314.000000%'

"{0:.2e},{0:.2E},{0:.2f},{0:.2%}".format(3.14)
# out: '3.14e+00,3.14E+00,3.14,314.00%'

%操作符

模版

格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。

1
print("I'm %s. I'm %d year old" % ('Vamei', 99))

"I'm %s. I'm %d year old" 为我们的模板。%s为第一个格式符,表示一个字符串。%d为第二个格式符,表示一个整数。('Vamei', 99)的两个元素'Vamei'和99为替换%s%d的真实值。 在模板和tuple之间,有一个%号分隔,它代表了格式化操作。

整个"I'm %s. I'm %d year old" % ('Vamei', 99) 实际上构成一个字符串表达式。我们可以像一个正常的字符串那样,将它赋值给某个变量。比如:

1
2
3
4

a = "I'm %s. I'm %d year old" % ('Vamei', 99)
print(a)

我们还可以用词典来传递真实值。如下:

1
print("I'm %(name)s. I'm %(age)d year old" % {'name':'Vamei', 'age':99})

可以看到,我们对两个格式符进行了命名。命名使用()括起来。每个命名对应词典的一个key。

格式符

格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:

格式符 说明
%s 字符串 (采用str()的显示)
%r 字符串 (采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
%% 字符”%”

可以用如下的方式,对格式进行进一步的控制:

%[(name)][flags][width].[precision]typecode

(name)为命名

flags可以有+,-,' '0+表示右对齐。-表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。

width表示显示宽度

precision表示小数点后精度

比如:

1
2
3
print("%+10x" % 10)
print("%04d" % 5)
print("%6.3f" % 2.3)

上面的width, precision为两个整数。我们可以利用*,来动态代入这两个量。比如:

1
print("%.*f" % (4, 1.2))

Python实际上用4来替换*。所以实际的模板为"%.4f"

参考

  1. https://blog.csdn.net/sinat_28981497/article/details/69218893
  2. https://www.cnblogs.com/vamei/archive/2013/03/12/2954938.html
  3. https://blog.csdn.net/i_chaoren/article/details/77922939