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 深圳

时间: 2024-10-07 00:57:06

3.1.3 格式化字符串的语法的相关文章

使用literal语法格式化字符串

支持arm64之后,格式化字符串的时候会遇到一些问题,主要与NSInteger的定义有关: #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSUInteger; #else typedef int NSInteger; typedef unsign

编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串

建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求.更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活 多变的方法,可以根据需求的变化为类型提供多个格式化器.下面就来详细介绍这两种方法. 最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Obj

【python】format函数格式化字符串的用法

来源:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱.语法 它通过{}和:来代替%.“映射”示例 通过位置 ? 1 2 3 4 5 6 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kz

Python 的格式化字符串format函数

阅读mattkang在csdn中的博客<飘逸的python - 增强的格式化字符串format函数>所做笔记 自从python2.6开始,新增了一种格式化字符串的函数str.format(),他通过{}和:来代替%. 1.映射实例 In[1]: '{0},{1}'.format('abc', 18) Out[1]: 'abc,18' In[2]: '{}'.format(18) out[2]: 18 In[3]: '{1},{0},{1}'.format('abc', 123) out[3]:

【python】格式化字符串

字符串格式化操作符(%)只适用于字符串类型,非常类似于C 语言里面的printf()函数的字符串格式化,甚至所用的符号都一样,都用百分号(%),并且支持所有printf()式的格式化操作.语法如下:format_string % string_to_convertformat_string为格式标记字符串,形式为“%cdoe”:string_to_convert 为要格式化的字符串,如果是两个以上,则需要用小括号括起来. 字符串格式化符号 格式化符号 说明 %c 转换成字符(ASCII 码值,或

python_Python中用format函数格式化字符串的用法

这篇文章主要介绍了Python中用format函数格式化字符串的用法,格式化字符串是Python学习当中的基础知识,本文主要针对Python2.7.x版本,需要的朋友可以参考下 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和:来代替%. “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]:

格式化字符串format函数

自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和:来代替%. “映射”示例 通过位置 字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以. 通过关键字参数 通过对象属性 通过下标 有了这些便捷的“映射”方式,我们就有了偷懒利器.基本的python知识告诉我们,list和tuple

飘逸的python - 增强的格式化字符串format函数

自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和:来代替%. "映射"示例 通过位置 字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以. 通过关键字参数 通过对象属性 通过下标 有了这些便捷的"映射"方式,我们就有了偷懒利器.基本的Python知识

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

自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱.语法 它通过{}和:来代替%.“映射”示例 通过位置 ? 1 2 3 4 5 6 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},