Python 3.8从零开始学
上QQ阅读APP看书,第一时间看更新

4.2.2 元组的字符串格式化

格式化操作符的右操作数可以是任何元素,但如果右操作数是元组或映射类型(如字典,下一章进行讲解),那么字符串格式化的方式将会有所不同。目前尚未涉及映射(字典),这里先了解元组的字符串格式化。

如果右操作数是元组,元组中的每个元素都会被单独格式化,每个值都需要对应的一个占位符。例如:

>>> print('%s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌' % ('2022','北京',5))
2022年的冬奥会将在北京举行,预测中国至少赢取5枚金牌
>>> print('%s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌' % ('2022','北京')) #少一个值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
print('%s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌' % ('2022','北京'))
TypeError: not enough arguments for format string
>>> print('%s年的冬奥会将在%s举行,预测中国至少赢取枚金牌' % ('2022','北京',5)) #少一个占位符
Traceback(most recent call last):
File "<pyshell#5>", line 1, in <module>
print('%s年的冬奥会将在%s举行,预测中国至少赢取枚金牌' % ('2022','北京',5))
TypeError: not enough arguments for format string
>>> print('%s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌' % ['2022','北京',5])
Traceback(most recent call last):
File "<pyshell#7>", line 1, in <module>
print('%s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌' % ['2022','北京',5])
TypeError: not enough arguments for format string
>>> print('%s年的冬奥会将在北京举行' % ['2022'])
['2022']年的冬奥会将在北京举行
>>> print('%s年的冬奥会将在北京举行' % '2022')
2022年的冬奥会将在北京举行
>>> print('%s年的冬奥会将在北京举行' % ['2022','北京'])
['2022', '北京']年的冬奥会将在北京举行

由输出结果可以看到,在有多个占位符的字符串中,可以通过元组传入多个待格式化的值。若字符串中有多个占位符,但给的待格式化的值的格式不对或数量不对,执行报错。若字符串中占位符的个数少于给定元组中元素的个数,执行报错。若使用列表代替元组,列表仅代表一个值。

在前面一些示例的演示后,接下来介绍占位符的一些基本使用说明。注意,占位符中各项的顺序是至关重要的。

(1)%字符:标记占位符开始。

(2)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,宽度就会从元组中读出。

(3)转换标志(可选):-表示对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值位数不够时用0填充。

(4)点(.)后跟精度值(可选):如果转换的是实数,精度值表示出现在小数点后的位数;如果转换的是字符串,该数字就表示最大宽度;如果是*,精度就会从元组中读出。

(5)转换类型:参见表4-2。

下面将分别讨论。

1.简单字符串格式化

在交互模式下输入:

>>> print('圆周率PI的值为:%.2f' % 3.14)
圆周率PI的值为:3.14
>>> print('石油价格为每桶:$%d' % 96)
石油价格为每桶:$96

由输出结果可以看到,简单的字符串格式化只需要在占位符中标识转换类型。

2.格式化时指定字段宽度和精度

占位符包括对字段格式化时字段宽度和精度的指定。字段宽度是转换后的值所保留的最小字符个数,字符精度是数字转换结果中应该包含的小数位数或字符串转换后的值所能包含的最大字符个数。

在交互模式下输入:

>>> print('圆周率PI的值为:%10f' % 3.141593)                   #字段宽度为10
圆周率PI的值为:3.141593                     #字符串宽度为10,被字符串占据8个空格,剩余两个空格
>>> print('保留2位小数,圆周率PI的值为:%10.2f' % 3.141593)       #字段宽度为10
保留2位小数,圆周率PI的值为:3.14                 #字符串宽度为10,字符串占据4个,剩6个
>>> print('保留2位小数,圆周率PI的值为:%.2f' % 3.141593)       #输出,没有字段宽度参数
保留2位小数,圆周率PI的值为:3.14
>>> print('字符串精度获取:%.5s' % ('hello world'))            #打印字符串前5个字符
字符串精度获取:hello

由输出结果可知,占位符中的字段宽度和精度值都是整数,宽度和精度之间通过点号(.)分隔。字段宽度和精度两个参数都是可选参数,如果给出精度,在精度值前就必须包含点号。

接着看以下代码:

>>> print('从元组中获取字符串精度:%*.*s' % (10,5,'hello world'))
从元组中获取字符串精度:     hello              #输出字符串宽度为10、精度为5
>>> print('从元组中获取字符串精度:%.*s' % (5,'hello world'))
从元组中获取字符串精度:hello                  #输出精度为5

由输出结果可以看到,可以使用*作为字段宽度或精度(或两者都用*),数值会从元组中读出。

3.符号、对齐和0填充

开始介绍之前先看一个示例:

>>> print('圆周率PI的值为:%010.2f' % 3.141593)
圆周率PI的值为:0000003.14

输出结果是不是怪怪的,这个我们称之为“标表”。在字段宽度和精度之前可以放置一个“标表”,可以是零、加号、减号或空格。零表示用0进行填充。

减号(-)用来左对齐数值,例如:

>>> print('圆周率PI的值为:%10.2f' % 3.14)
圆周率PI的值为:      3.14
>>> print('圆周率PI的值为:%-10.2f' % 3.14)
圆周率PI的值为:3.14      #此处右侧为多出的空格

从输出结果看到,使用减号时,数字右侧多出了额外的空格。

空白(“ ”)表示在正数前加上空格,例如:

>>> print(('% 5d' % 10) + '\n' + ('% 5d' % -10))
10
-10

由输出结果可以看到,该操作可以用于对齐正负数。

加号(+)表示无论是正数还是负数都表示出符号,例如:

>>> print(('宽度前加加号:%+5d' % 10) + '\n' + ('宽度前加加号:%+5d' % -10))
宽度前加加号:  +10
宽度前加加号:  -10

该操作也可以用于数值的对齐。