master
/ 5.2.7 字符串格式化.ipynb

5.2.7 字符串格式化.ipynb @masterview markup · raw · history · blame

Notebook

字符串格式化

5.12 字符串格式化.jpg

In [ ]:
<模板字符串>.format(<逗号分隔的参数>)

format()方法中<模板字符串>的大括号中除了包括参数序号,还可以包括格式控制信息。此时,位置的内部样式如下:

格式字符串包含有以花括号 {} 括起来的“替换字段”。
不在花括号之内的内容被视为字面文本,会不加修改地复制到输出中。
如果你需要在字面文本中包含花括号字符,可以通过重复来转义: {{ and }}。

替换字段的语法如下:

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 ::= + conversion ::= "r" | "s" | "a" format_spec ::=
In [ ]:
{<参数序号>: <格式控制标记>}

其中,<格式控制标记>用来控制参数显示时的格式,包括:

<填充><对齐><宽度>,<.精度><类型>6 个字段,format格式控制标记如表5.10所示。

整数 : 填充 对齐 宽度 , .精度 类别









左对齐:<
右对齐:>
居中: ^
=



数字
千位
分隔符
浮点数
小数位数
或字符串
最大输出长度
c Unicode 字符
d 十进制
b/o/x 二/八/十六进制
e/E 浮点数指数形式
f/F 浮点数标准形式
% 百分比输出,并保留两位小数
format_spec ::= [[fill]align][sign]["z"]["#"]["0"][width][grouping_option]["." precision][type] fill ::= align ::= "<" | ">" | "=" | ^" sign ::= "+" | "-" " " width ::i git+ grouping_option ::= " | "," precision = digit+ type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X " | "%"

<填充>:指<宽度>内除了参数外的字符采用什么方式表示,默认采用空格,可以通过<填充>更换。

<对齐>:指参数在<宽度>内输出时的对齐方式,分别使用<、> 和 ^ 三个符号表示左对齐、右对齐和居中对齐。使用"="时,强制将填充放在符号(如果有)之后、数字之前。这用于打印格式为 "+000000120 "的字段。该对齐选项仅对数字类型有效。当 "0 "紧接在字段宽度之前时,它将成为数字的默认对齐方式。

<宽度>:指当前位置的设定输出字符宽度,如果该位置对应的format()参数长度比<宽度>设定值大,则使用参数实际长度输出。如果该值的实际位数小于指定宽度,则位数将被默认以空格字符补充。

各种对齐选项的含义如下:

'<':强制字段在可用空间内左对齐(这是大多数对象的默认值)。
'>':强制字段在可用空间内右对齐(这是数字的默认值)。
'=':强制在符号(如果有)之后数码之前放置填充。 这被用于以 '+000000120' 形式打印字段。 这个对齐选项仅对数字类型有效。 这是当 '0' 紧接在字段宽度之前时的默认选项。
'^':强制字段在可用空间内居中。最小字段宽度,

In [1]:
s = '123456789'
for i in range(1, 10):
    print('{:->9}'.format(s[:i]))  # 字符串切片,得到前i个字符,右对齐输出,“-”填充
--------1
-------12
------123
-----1234
----12345
---123456
--1234567
-12345678
123456789
In [2]:
s = '123456789'
for i in range(1, 10):
    print('{:~^17}'.format(s[:i] + s[:i - 1][::-1]))  # 字符串切片,得到前i个字符,居中对齐输出,“+”填充
~~~~~~~~1~~~~~~~~
~~~~~~~121~~~~~~~
~~~~~~12321~~~~~~
~~~~~1234321~~~~~
~~~~123454321~~~~
~~~12345654321~~~
~~1234567654321~~
~123456787654321~
12345678987654321
In [3]:
# <,>(逗号):<格式控制标记>中逗号用于显示数字的千位分隔符

print('{:,}'.format(123456789))  # 输出 123,456,789

<.精度>:表示两个含义,由小数点(.)开头,用于浮点数和字符串,整数时不可用。
对于用“f”和“F”格式化的浮点数,精度表示小数点后保留的数字位数,末尾为0的浮点数保持末尾的0的输出。

In [4]:
print('{:.8f}'.format(3141.59265300979)) # 3141.59265301
print(round(3141.59265300979,5))
print('{:.8F}'.format(3141.59265300079)) # 3141.59265300
print('{:.6f}'.format(314.150000358979)) # 314.150000
3141.59265301
3141.59265
3141.59265300
314.150000

对于用“g”和“G”浮点数,精度表示小数点前面和后面保留的数字位数,且会舍去输出数据末尾的零。

In [4]:
print('{:.8g}'.format(314.159265358979))  # 314.15927
print('{:.8G}'.format(314.150000358979))  # 314.15
print('{:.8}'.format('3141.59265300079')) # 3141.592
314.15927
314.15
3141.592

对于字符串,精度表示输出的最大长度。

In [ ]:
print('{:.4}'.format('1.23456789'))  # 1.23,算上小数点为4个字符

可结合宽度控制输出格式:

In [1]:
print('{:*^12.4}'.format('1.23456789'))  # ****1.23****,占位12字符,字符串取4个字符

精度的数字前没有点时,表示输出的最小占位宽度,输出字符大于宽度时,按实际位数输出。

In [7]:
print('{:>4}'.format('1'))          # 1,占4个字符宽度,右对齐
print('{:.>4}'.format('1'))          # 1,占4个字符宽度,右对齐,为方便查看,用点做填充字符
print('{:4}'.format('1.23456789'))  # 1.23456789,超过宽度时按实际字符输出

<类型>:表示输出整数和浮点数类型的格式规则。
对于整数类型,输出格式包括6 种
对于浮点数类型,输出格式包括4 种
浮点数输出时尽量使用<.精度>表示小数部分的宽度,有助于更好控制输出格式。

符号 功能
b 输出整数的二进制方式;
c 输出整数对应的 Unicode 字符;
d 输出整数的十进制方式;
o 输出整数的八进制方式;
x/X 输出整数的小写/大写十六进制方式;
e/E 输出浮点数对应的小写字母 e /大写字母 E的指数形式;
f/F 输出浮点数的标准浮点形式,保留结果末尾的零;3.1500
g/G 输出浮点数,末尾的零会从结果中被移除,3.15
% 输出浮点数的百分形式
In [13]:
print('{:b}'.format(15))               # b表示将整数转为二进制,1111
print('{:>22,.3f}'.format(15703050635.0))# 22字符居右,千位分隔,3位小数
# 输出:    15,703,050,635.000
print("{}{:.2f}{:.4}".format("圆周率",3.1415926, '是无理数的一个典型例子'))
# .2f 表示浮点数截取2位小数;.4 表示将传入的字符串截取4个字符
# 输出:圆周率3.14是无理数
print('{:*<20}'.format('开始注释'))   # 宽20字符,居左,空位用*填充
# 输出:开始注释****************
print('{:*^20}'.format('这是注释'))   # 居中
# 输出:********这是注释********
print('{:^20}'.format('无填充字符'))  # 居中,无填充
# 输出:       无填充字符
print('{:*>20}'.format('注释结束'))   # 居右对齐
# 输出:****************注释结束

在计算机中,所有的数据在存储和运算时都要使用二进制数表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
计算机中存储的都是二进制以十进制整数、十六进制、八进制、二进制和字符形式输出ASCII码值在90-100之间的字符

In [27]:
width = 5
for num in range(90, 100):
    for kind in 'dxobc':
        print('{0:{width}{base}}'.format(num, base=kind, width=width), end=' ')
    print()
In [31]:
width = 5
for num in range(90, 100):
    for kind in 'dxobc':
        print('{0:{1}{2}}'.format(num, width, kind), end=' ')
    print()

format函数具有丰富的格式控制方法,可以方便、快速的进行各种格式的输出,一般建议使用format函数做输出格式控制。

自Python 3.6开始,又增加了一种格式化字符串字面值(Formatted string literals)方法,也称为f-strings。这种方法是带有'f' 或'F' 前缀的字符串字面值。字符串可包含替换字段,即以{} 标识的变量或表达式,格式化字符串字面值实际上是会在运行时被求值的表达式。

In [26]:
width = 5
for num in range(90, 100):
    for kind in 'dxobc':
        print(f'{num:{width}{kind}}', end=' ')
    print()

由于历史的原因,同时考虑到其他语言程序员的习惯,Python 中目前仍保留了%格式符的用法,下面用几个例子了解一下%格式符的语法。

符号 功能
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%u 格式化无符号整型
%o 格式化无符号八进制数
%x或 %X 格式化无符号十六进制数
%f 或 %F 格式化浮点数字,可指定小数点后的精度
%e或 %E 用科学记数法格式化浮点数
%g或 %G 自动选择 %f 和 %e 两种格式中较短的格式输出,并且不输出数字后面没有意义的零
%p 用十六进制数格式化变量的地址
% 当字符串中存在格式化标志时,需要用 %%表示一个百分号
In [14]:
print('Hi, %s, you have $%d.' % ('Michael', 1000000))

格式化操作符辅助指令

符号 功能
* 定义宽度或者小数点精度
- 用做左对齐
+ 在正数前面显示加号( + )
<sp > 在正数前面显示空格
\# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0 显示的数字前面填充“0”而不是默认的空格
% “%%”输出一个单一的“%”
(var) 映射变量(字典参数)
m.n m是显示的最小总宽度,n是小数点后的位数
In [15]:
print('--------%(p).2f' % {'p': 1.23456})  # 保留2位有小数
In [16]:
print('--------%(p)f' % {'p': 1.23456})    # 默认精度,保留小数点后6位

%c 65转unicode值对应字符A;
%o 整数15转成对应的8进制数17;
%x 整数15转成对应的16进制数f

In [17]:
print('***%c***%o***%x' % (65, 15, 15))
In [ ]: