IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]3.1.3 格式化字符串的语法

    caimouse发表于 2015-07-04 12:18:24
    love 0
    字符串str.format()和Formatter类都是使用相同的格式化字符串。格式化字符使用大括号{}来包含替换的字段,任何不在大括号里的字符都是直接输出而不作转换。因此,想要输出大括号,就需要使用特别的方式,使用双大括号方式来输出大括号,比如{{来输出{,}}来输出}。 格式化字符串的语法如下:replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"field_name ::= arg_name ("." attribute_name | "[" element_index "]")*arg_name ::= [identifier | integer]attribute_name ::= identifierelement_index ::= integer | index_stringindex_string ::= +conversion ::= "r" | "s" | "a"format_spec ::= 3.1.3.1 格式字符串说明串 格式字符串说明串的语法如下:format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]fill ::= align ::= "<" | ">" | "=" | "^"sign ::= "+" | "-" | " "width ::= integerprecision ::= integertype ::= "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,ca,b,cc,b,ac,b,a888,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参数里需要采用关键字参数方式传入,才可以把这些关键字参数与输出的指定的名称对应。在语句'mouse:({x},{y})'.format(**mousept)中,就直接使用了字典参数mousept进行传入,然后使用两个星号把字典参数反向解析为关键字参数传入。 访问参数的属性: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.0Point(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.6180000.618000; -0.618000 0.618000; -0.6180000.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: 110111int: 55; hex: 40; oct: 67; bin: 110111int: 55; hex: 0x37; oct: 0o67; bin: 0b110111 用逗号作为千位的分隔符print('{:,}'.format(9876543210))print('{0:,}'.format(88888888888889876543210))输出结果如下:9,876,543,21088,888,888,888,889,876,543,210 格式化时输出百分比值print('百分比输出:{:.2%}'.format(50/100))print('百分比输出:{:.2%}'.format(1.08))输出结果如下:百分比输出:50.00%百分比输出:108.00% 格式化时输出时间格式import datetimed = 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 = 5for 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 深圳


沪ICP备19023445号-2号
友情链接