3.1.3 格式化字符串的语法
字符串str.format()和Formatter类都是使用相同的格式化字符串。
格式化字符使用大括号{}来包括替换的字段。不论什么不在大括号中的字符都是直接输出而不作转换。因此。想要输出大括号,就须要使用特别的方式,使用双大括号方式来输出大括号。比方{{来输出{,}}来输出}。
格式化字符串的语法例如以下:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | integer]
attribute_name ::= identifier
element_index ::= integer | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= <described in the next section>
3.1.3.1 格式字符串说明串
格式字符串说明串的语法例如以下:
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
3.1.3.2 格式化字符串的样例
以下样例主要採用新的格式化方式,而不是採用旧的%格式化方式。但在大多数情况下,新的格式语法与旧的语法是类似的。使用大括号{}和分号:来代替百分号%。
比方’%03.2f’就表示为’{:03.2f}’。只是,新的格式化方式也有些新选项和不同的使用方式,如以下的样例:
通过位置来訪问參数:
#string
import string
print('{0},{1},{2}'.format('a', 'b', 'c'))
print('{},{},{}'.format('a', 'b', 'c'))
print('{2},{1},{0}'.format('a', 'b', 'c'))
print('{2},{1},{0}'.format(*'abc'))
print('{2},{1},{2}'.format('abc', '123','888'))
结果输出例如以下:
a,b,c
a,b,c
c,b,a
c,b,a
888,123,888
在这个样例里,语句'{0},{1},{2}'.format('a', 'b', 'c')中0,1,2是位置參数的序号,{0}就是说把參数‘a’在这个地方替换输出,位置參数的序号是从0開始计数。从左向右依次添加。
在语句'{},{},{}'.format('a', 'b', 'c')里,没有指明位置參数,就按默认的位置进行输出,假设大括号的个数少于位置參数个数,那么后面的參数就忽略输出。
在语句{2},{1},{0}'.format('a', 'b', 'c')中,能够看到位置參数能够放在不同的输出位置上,因而它的输出就变成c字母先输出,最后才是a输出。
在语句'{2},{1},{0}'.format(*'abc')中,这里主要使用參数列表化解析机制。在參数‘abc’前加入星号*,就是把參数先变成列表,再进行处理,列表中每一项的位置,就相应输出时指明的位置參数,所以这语句的输出还是c,b,a的顺序。在语句'{2},{1},{2}'.format('abc', '123','888')中。主要说明了位置參数是可反复出现。也能够缺少一些位置參数。
通过名称来訪问參数:
print('mouse:({x},{y})'.format(x = '100', y = '200'))
mousept = {'x' : '200', 'y' : '888'}
print('mouse:({x},{y})'.format(**mousept))
结果输出例如以下:
mouse:(100,200)
mouse:(200,888)
在语句'mouse:({x},{y})'.format(x = '100', y = '200')中。并没有发现前面位置參数的数字,而是使用名称x,y代替了。
当然在format參数里须要採用keyword參数方式传入。才干够把这些keyword參数与输出的指定的名称相应。
在语句'mouse:({x},{y})'.format(**mousept)中。就直接使用了字典參数mousept进行传入,然后使用两个星号把字典參数反向解析为keyword參数传入。
訪问參数的属性:
print('复数的属性訪问,实部={0.real} 虚部={0.imag}'.format(3 + 4j))
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self):
return 'Point({self.x}, {self.y})'.format(self = self)
print(str(Point(5,5)))
输出结果例如以下:
复数的属性訪问。实部=3.0 虚部=4.0
Point(5, 5)
在语句'复数的属性訪问,实部={0.real} 虚部={0.imag}'.format(3 + 4j)中,格式化中直接訪问复数的属性。结果属性能够直接在字符串输出。在语句'Point({self.x}, {self.y})'.format(self = self)中,能够直接訪问类的属性。结果把类属性的值打印出来。这样比在格式化函数里再又一次写一遍属性要要简单非常多,少输入了不少字符。
訪问參数的项:
xy = (20, 30)
print('X轴:{0[0]}, Y轴:{0[1]}'.format(xy))
输出结果例如以下:
X轴:20, Y轴:30
通过这个样例里能够看到在格式化中直接訪问元组的项,比方0[0]表示訪问第一个參数的第一项。0[1]表示訪问第一个參数的第二项。
使用!s和!r来替换%s和%r:
print('repr() : {!r}; str() : {!s}'.format('abc', '123'))
输出结果例如以下:
repr() : 'abc'; str() : 123
通过这个样例。就能够看到使用!s来替换%s,这样更加简单方便,相同!r替换%r。
字符串排列和宽度对齐
print('{:<30}'.format('左对齐'))
print('{:>30}'.format('右对齐'))
print('{:^30}'.format('居中对齐'))
print('{:*^30}'.format('居中对齐'))
输出结果例如以下:
左对齐
右对齐
居中对齐
*************居中对齐*************
替换%+f。%-f和% f,以及指定符号的浮点数格式化
print('{:+f}; {:+f}'.format(0.618, -0.618))
print('{:f}; {:f}'.format(0.618, -0.618))
print('{: f}; {: f}'.format(0.618, -0.618))
print('{:-f}; {:-f}'.format(0.618, -0.618))
输出结果例如以下:
+0.618000; -0.618000
0.618000; -0.618000
0.618000; -0.618000
0.618000; -0.618000
替换%x和%o。同一个值同一时候格式化为不同的进制输出
print('int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}'.format(55))
print('int: {0:d}; hex: {1:x}; oct: {0:o}; bin: {0:b}'.format(55, 64))
print('int: {0:#d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}'.format(55))
输出结果例如以下:
int: 55; hex: 37; oct: 67; bin: 110111
int: 55; hex: 40; oct: 67; bin: 110111
int: 55; hex: 0x37; oct: 0o67; bin: 0b110111
用逗号作为千位的分隔符
print('{:,}'.format(9876543210))
print('{0:,}'.format(88888888888889876543210))
输出结果例如以下:
9,876,543,210
88,888,888,888,889,876,543,210
格式化时输出百分比值
print('百分比输出:{:.2%}'.format(50/100))
print('百分比输出:{:.2%}'.format(1.08))
输出结果例如以下:
百分比输出:50.00%
百分比输出:108.00%
格式化时输出时间格式
import datetime
d = datetime.datetime(2015, 1, 13, 12, 30, 59)
print('时间格式化: {:%Y-%m-%d %H:%M:%S}'.format(d))
输出结果例如以下:
时间格式化: 2015-01-13 12:30:59
嵌套格式化參数
for align, text in zip('<^>', ['左', '中', '右']):
print('{0:{fill}{align}16}'.format(text, fill=align, align=align))
width = 5
for num in range(5, 12):
for base in 'dXob':
print('{0:{width}{base}}'.format(num, base=base, width=width), end = ' ')
print()
输出结果例如以下:
左<<<<<<<<<<<<<<<
^^^^^^^中^^^^^^^^
>>>>>>>>>>>>>>>右
5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000
9 9 11 1001
10 A 12 1010
11 B 13 1011
多个格式化模板并列
IPAddr = [192, 168, 0, 8]
print('{:02X}{:02X}{:02X}{:02X}'.format(*IPAddr))
输出结果例如以下:
C0A80008
蔡军生 QQ:9073204 深圳