python——str.format()函数

执行字符串格式化操作
格式:str.format(*参数字符串, ****关键字参数)
调用此方法的字符串可以包含用大括号{}分隔的文本或替换字段。
每个替换字段要么包含位置参数的数值索引,要么包含关键字参数的名称。返回字符串的副本,其中每个替换字段都被对应参数的字符串值替换。

>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'

格式字符串语法
str.format()方法和Formatter类共享相同的格式字符串语法(尽管在Formatter的情况下,子类可以定义自己的格式字符串语法)。语法与格式化字符串文字的语法相关,但有一些区别。

格式字符串包含由大括号{}包围的“替换字段”。任何不包含在大括号中的内容都被认为是文本,它将不加更改地复制到输出中。如果需要在文本中包含一个大括号字符,可以通过对它进行双精度转换:{{ 和 }}。

替换字段的语法如下:

replacement_field ::= “{” [field_name] ["!" conversion] [":" format_spec] “}”
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 “]”> +
conversion ::= “r” | “s” | “a”
format_spec ::= <在下一节中描述>

在不太正式的术语中,replacement_field可以以field_name开始,该field_name指定要格式化其值并插入到输出中而不是replacement_field中的对象。field_name后面可选跟一个 conversion field, conversion field前面加一个感叹号“!”和格式“spec”,前面是冒号“:”。它们为替换值指定非默认格式。

field_name本身以数字或关键字的arg_name开头。如果是数字,则表示位置参数;如果是关键字,则表示命名关键字参数。

如果格式字符串中的数字arg_names按顺序是0、1、2,…,则可以全部省略(而不仅仅是一些),数字(0、1、2,…)将自动按该顺序插入。
arg_name 不是用引号分隔的,所以不能在格式字符串中指定任意字典键(例如字符串“10”或“:-]”)。arg_name后面可以跟任意数量的索引或属性表达式。

表单的表达式“.name”使用getattr()选择命名属性,而表单的表达式“[index]”使用uuGetItem_uuu()进行索引查找。
简单的例子:

"First, thou shalt count to {0}"  # 引用第一个位置参数
"Bring me a {}"                   # 默认引用第一个位置参数
"From {} to {}"                   # 和 "From {0} to {1}"一样
"My quest is {name}"              #引用关键字参数“name”
"Weight in tons {0.weight}"       # 第一个位置参数的“weight”属性
"Units destroyed: {players[0]}"   # 关键字参数“players”的第一个元素。

格式规范小型语言
“格式规范”用于在格式字符串中包含的替换字段中定义各个值的显示方式(请参见格式字符串语法和格式化字符串文本)。它们也可以直接传递给内置的format()函数。每个格式表类型都可以定义如何解释格式规范。

大多数内置类型为格式规范实现以下选项,尽管某些格式选项仅受数字类型支持。

一般的惯例是,空格式字符串(“”)产生的结果与对该值调用str()时产生的结果相同。非空格式字符串通常会修改结果。

标准格式说明符的一般形式是:
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::=
align ::= “<” | “>” | “=” | “^”
sign ::= “+” | “-” | " "
width ::= digit+
grouping_option ::= “_” | “,”
precision ::= digit+
type ::= “b” | “c” | “d” | “e” | “E” | “f” | “F” | “g” | “G” | “n” | “o” | “s” | “x” | “X” | “%”
如果指定了有效的对齐值,则前面可以是填充字符,可以是任何字符,如果省略,则默认为空格。在格式化字符串文本中或使用str.format()方法时,不可能使用文本大括号(“”或“”)作为填充字符。但是,可以使用嵌套的替换字段插入大括号。此限制不影响format()函数。

'{:>14}'.format("*"*i)
'{:<14}'.format("*"*i)
'{:^14}'.format("*"*i)
"{0:>4}".format(i*j)
#   : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

各种对齐选项的含义如下:
|Option | Meaning |
|’<’ |强制字段在可用空间内保持对齐(这是大多数对象的默认设置)。|
| ‘>’ |强制字段在可用空间内右对齐(这是数字的默认值)。 |
| ‘^’ | 强制字段在可用空间内居中。 |
| ‘=’ | 强制将填充物放在符号(如果有)之后,但放在数字之前。这用于以“+000000120”格式打印字段。此对齐选项仅对数字类型有效。当“0”紧跟在字段宽度之前时,它将成为默认值。
请注意,除非定义了最小字段宽度,否则字段宽度将始终与要填充的数据大小相同,因此在这种情况下,对齐选项没有意义。

符号选项仅对数字类型有效,可以是以下类型之一:
“+”表示一个符号应该同时用于正数和负数。

“-”表示符号只能用于负数(这是默认行为)。

‘’ ''表示应在正数上使用前导空格,在负数上使用减号。
'#'选项使转换使用“替代形式”。对于不同的类型,替代形式的定义不同。此选项仅对integer、float、complex和decimal类型有效。对于整数,使用二进制、八进制或十六进制输出时,此选项会将前缀分别添加到输出值“0b”、“0o”或“0x”。对于浮点数、复数和小数,替换形式会导致转换结果始终包含小数点字符,即使后面没有数字。通常情况下,只有当后面有一个数字时,小数点字符才会出现在这些转换的结果中。此外,对于“g”和“g”转换,尾随零不会从结果中移除。

“,”选项表示使用逗号作为千位分隔符。对于区分区域设置的分隔符,请改用“n”整数表示类型。
'_'选项表示对浮点表示类型和整数表示类型“d”使用了千位分隔符的下划线。对于整数表示类型“b”、“o”、“x”和“x”,下划线将每4位插入一次。对于其他演示文稿类型,指定此选项是错误的。
宽度是定义最小字段宽度的十进制整数。如果未指定,则字段宽度将由内容确定。

如果没有给出显式对齐方式,则在宽度字段前面加上一个零(“0”)字符,可以为数字类型启用符号感知零填充。这等效于对齐类型为“=”的填充字符“0”。

精度是一个十进制数字,指示对于格式为“f”和“f”的浮点值,小数点后应显示多少位,对于格式为“g”或“g”的浮点值,小数点前后应显示多少位。对于非数字类型,字段指示最大字段大小——换句话说,字段内容将使用多少字符。整数值不允许精度。

最后,类型决定了应该如何显示数据。

可用的字符串表示类型包括:
‘s’ 字符串格式。这是字符串的默认类型,可以省略。
None 与“s”相同。
可用的整数表示类型为:
‘b’ Binary format. Outputs the number in base 2.
‘c’ Character. Converts the integer to the corresponding unicode character before printing.
‘d’ Decimal Integer. Outputs the number in base 10.
‘o’ Octal format. Outputs the number in base 8.
‘x’ Hex format. Outputs the number in base 16, using lower-case letters for the digits above 9.
‘X’ Hex format. Outputs the number in base 16, using upper-case letters for the digits above 9.
‘n’ Number. This is the same as ‘d’, except that it uses the current locale setting to insert the appropriate number separator characters.
None The same as ‘d’.
除了上面的表示类型之外,整数还可以用下面列出的浮点表示类型格式化(除了“n”和“None”)。执行此操作时,float()用于在格式化之前将整数转换为浮点数。

浮点值和十进制值的可用表示类型为:
“e”指数表示法。以科学符号打印数字,使用字母“e”表示指数。默认精度为6。

“E”指数表示法。与’e’相同,只是它使用大写’e’作为分隔符。

“f”定点表示法。将数字显示为定点数字。默认精度为6。

“F”定点表示法。与“f”相同,但将nan转换为nan,并将inf转换为inf。

‘g’

通用格式。对于给定的精度p >= 1,这将把数字四舍五入为p个有效数字,然后根据其大小将结果格式化为定点格式或科学符号。

具体规则如下:假设用表示类型’e’和精度p-1格式化的结果具有指数exp,那么如果-4 <= exp < p,则用表示类型’f’和精度p-1-exp格式化数字。否则,数字将使用表示类型“e”和精度p-1进行格式化。在这两种情况下,显著性后面的零将被删除,如果后面没有其他数字,小数点也将被删除。

无论精度如何,正无穷和负无穷、正零和负零以及nan分别被格式化为inf、-inf、0、-0和nan。

精度为0时,视为精度为1。默认精度为6。

“G”通用格式。与“g”相同,但如果数字太大,则切换到“E”。无穷大和NaN的表示也是大写的。

“n”的数字。这与“g”相同,只是它使用当前地区设置插入适当的数字分隔符。

“%”百分比。将数字乘以100并以固定(‘f’)格式显示,后面跟着百分号。

除了在使用定点表示法时,小数点后至少有一位数字外,没有一种表示法与“g”类似。默认精度与表示特定值所需的精度一样高。总的效果是匹配由其他格式修饰符更改的str()的输出。
str.format的例子
本节包含了**str.format()**语法的示例以及与旧的%-format的比较。
在大多数情况下,语法与旧的%-格式化类似,只是添加了{}和with:而不是%。例如,’%03.2f’可以翻译成’{:03.2f}’。
新的格式语法还支持新的和不同的选项,如下面的示例所示。

(1)按位置访问参数:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

(2)按名称访问参数:

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

(3)访问参数的属性:

>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> 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)
...
>>> str(Point(4, 2))
'Point(4, 2)'

(4)访问参数的项目:

>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'

(5)代替 %s and %r:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

(6)对齐文本并指定宽度:

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

(7)替换%+f、%-f和% f,并指定一个符号:

>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

(8)替换%x和%o,并将值转换为不同的基数:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

(9)使用逗号作为千位分隔符:

>>> '{:,}'.format(1234567890)
'1,234,567,890'

(10)表达一个百分比:

>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'

(11)使用特定类型的格式:

>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

(12)嵌套参数和更复杂的例子:

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> 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

https://docs.python.org/3.6/library/string.html#formatspec

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值