
2.5 字符串格式化
在上面的情况中,我们都是已经知道了一个字符串中的全部内容。但是在有些情况下,有些位置上的字符可能在编写代码时并不清楚,因此需要将这种情况考虑进来,通常情况下,我们将这种方式命名为字符串格式化。Python提供了两种方法:一种是使用%符号来完成格式化,另一种是使用format函数来完成格式化。
print函数格式化
通常情况下,%号会与print函数一起完成格式化任务。在print函数的参数中,可以使用以%为标志的转换说明符对数据进行格式化输出。在Python中使用转换说明符来代表一个占位符,在程序输出时,这里的数值会被表达式的值代替。例如下面的代码:

在使用print函数来完成格式化时,将需要格式化的字符串用引号包围起来,在需要使用格式化的地方放置一些转换说明符。上面的程序中使用%d来表述说明符,在字符串输出后,这个位置上的内容会被后面的age变量的值所替代。
当需要格式化的字符数超过一个时,可以包含多个转换说明符,对应的后面参数也得提供多个表达式,用以替换对应的转换说明符;多个表达式要使用小括号()包围起来:

运行上面的程序后,可以得到下面的结果。在上面的代码中我们使用了不同类型的转换说明符,其中s对应于字符串,d对应于数值。

表2-2列出了Python中一些常见的转换说明符。
表2-2 常见的转义字符

除了使用上面的转换说明符,还可以为转义字符指定最小输出宽度(即至少占用多少个字符的位置):
● %5d表示输出的整数宽度至少为5。
● %7s表示输出的字符串宽度至少为7。
下面的程序显示对同一个数据进行不同长度的格式化后的输出:

将上面的文件运行后,就可以得到下面的结果:

从上面程序的运行结果可以发现,对于整数和字符串,如果数据的实际宽度小于指定宽度,输出的结果会在左侧用空格补全;但是当数据的实际宽度大于指定宽度时,输出的结果会按照数据的实际宽度输出。所以说,这里指定的只是最小宽度,当数据的实际宽度足够时,指定的宽度就没有实际意义了。
通常情况下,使用print函数输出的数据是右对齐的。即当数据的长度不够时,数据总是先在右边输出,而在左边补充空格以达到指定的宽度。Python通过在最小宽度数值前增加一个标志来改变对齐方式,常见的标志如表2-3所示。
表2-3 对齐方式

对于整数数据而言,当指定数据左对齐时,在右边补0是没有效果的,因为这样会改变整数的值。对于小数数据而言,上面的三个标志能够同时使用。但是对于字符串数据而言,只能使用-标志,因为符号对于字符串没有意义,而补0的做法会改变字符串的值。将下面的代码输入一个新建的文件中,并运行:

运行上面的代码后可以得到下面的结果:

对于小数(浮点数)类型的数据而言,print函数还能够指定小数的数字位数,也可以理解为小数的输出精度。输出精度值要放在最小宽度之后,两者中间使用点号隔开;也可以不写最小宽度,只写精度。具体格式如下:

其中x表示最小宽度,y表示输出精度。将下面的代码输入一个新文件中,然后运行这个文件:

运行上面的代码后,可以得到下面的结果:

format格式化
除了使用print函数来进行格式化处理,Python中还可以使用format函数来完成字符串的格式化,常用的format函数语法如下:

在上面的语法中,s表示处理的字符串,a r g s表示要进行格式转换的项,如果有很多个项,每个项之间使用逗号进行区分。在表示显示样式格式时,需要使用大括号和冒号来指定占位符,其完整的语法格式为:

在上面的格式中用[]括起来的参数表示可选的,既可以使用,也可以不使用。每个参数的含义如下。
index:表示后边设置的格式要作用到args中第几个数据,数据的索引从0开始。如果省略此选项,则会根据args中数据的先后顺序自动分配。
fill:表示空白位置应该填充的字符。如果填充字符是逗号且需要格式化的数据是整数或者浮点数,这个整数(或者浮点数)将以逗号分隔的形式输出,例如,5000000会输出5,000,000。
align:表示数据的对齐方式,常见的对齐方式如表2-4所示。
表2-4 align对齐符号

sign:表示数据是否有符号,常见的值以及对应的含义如表2-5所示。
表2-5 sign的值与含义

width:表示输出数据所占据的宽度。
precision:表示可以保留的浮点数的位数。
type:表示输出数据的具体类型,常见的类型如表2-6所示。
表2-6 type的值和含义
