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

4.2.1 经典的字符串格式化符号——百分号(%)

当你第一眼看到百分号(%)这个符号时,你可能会想到运算符中的取模操作。在做运算时,这么理解是没有问题的,但在字符串操作中,百分号(%)还有一个更大的用途,就是字符串的格式化。百分号(%)是Python中最经典的字符串格式化符号,也是Python中最古老的字符串格式化符号,这是Python格式化的OG(original generation),伴随着python语言的诞生。

先看看百分号(%)做字符串格式化的一些示例:

>>> print('hi,%s' % 'python')
hi,python
>>> print('一年有%s个月' % 12)
一年有12个月

由上面输出结果可以看到,在做字符串的格式化时,百分号(%)左边和右边分别对应了一个字符串,左边放置的是一个待格式化的字符串,右边放置的是要被格式化的值。

为便于美观,一般书写方式是在%的左边和右边各加一个空格,以便于指明这是在做格式化,当然,不加空格也可以,执行时并不会报错。

被格式化的值可以是一个字符串或数字。

待格式化字符串中的%s部分称为转换说明符,表示该位置需要放置被格式化的对象,通用术语为占位符。可以想象成在学校上自习,有的同学为避免自己的位置被其他同学占据,当离开座位时,通常会放一个物品在这个位置上,其他人过来时,若看到有物品在这个位置上,就知道这个位置已经有人了。这里就可以把%s当作我们使用的物品,作为一个占位的声明,放物品在位置上的同学就相当于百分号(%)右边的值。

在前面列举的示例中,%s也是有具体含义的,%s表示的意思是百分号(%)右边要被格式化的值会被格式化为字符串,%s中的s指的是str,即字符串。如果百分号(%)右边要被格式化的值不是字符串,就会使用字符串中的str()方法将非字符串转换为字符串。如示例中就将整数值12转换为字符串了,这种方式对大多数数值都有效。

若需要将数据转换为其他格式,该用怎样的方式处理?Python为我们提供了多种格式化符号,如表4-2所示。

表4-2 字符串格式化符号

根据表4-2,“一年有12个月”这个示例可以使用以下两种方式来表示:

>>> print('一年有%s个月' % 12)          #使用%s作为12的占位符
一年有12个月
>>> print('一年有%d个月' % 12)          #使用%d作为12的占位符
一年有12个月

由输出结果可以看到,对于整数类型,可以使用%s将整数类型格式化为字符串类型,也可以使用%d将变量直接格式化为整数类型。

上面讲解了整型的格式化,浮点型的格式化是怎样的呢?

在Python中,浮点型的格式化使用字符%f进行,例如:

>>> print('圆周率PI的值为:%f' % 3.14)
圆周率PI的值为:3.140000

由输出结果可以看到,结果中有很多位小数,但指定的被格式化的值只有两位小数。这里怎么让格式化的输出和指定的被格式化的值一致呢?

仔细查看表4-2可知,%f在使用时,可以指定精度值。在Python中,使用%f时,若不指定精度,则默认输出6位小数。若需要以指定的精度输出,比如上面想要得到输出2位小数的结果,就要指定精度为2,指定精度为2的格式如下:

%.2f

指定精度的输出的基本格式:在百分号(%)后面跟上一个英文格式下的句号,接着加上希望输出的小数位数,最后加上浮点型格式化字符f。

例如,上面圆周率输出的示例可以更改为如下的格式化输出:

>>> print('圆周率PI的值为:%.2f' % 3.14)
圆周率PI的值为:3.14

由输出结果可以看到,输出的结果已经符合预期结果了。

对于表4-2中所列举的字符串格式化符号,并不是所有的都比较常用,其中比较常用的只有%s、%d、%f三个,%e和%E在科学计算中使用得比较多,对于其他字符串格式化符号,大概了解即可,有兴趣也可以自行研究。

假如要输出类似 1.23%这样格式的结果,通过格式化的方式该怎么处理?直接使用加号连接符连接一个百分号可以吗?在交互模式下尝试如下:

>>> print('今天的空气质量比昨天提升了:%.2f' % 1.23+'%')
今天的空气质量比昨天提升了:1.23%

由输出结果可以看到,使用加号连接符连接百分号的方式可以得到最终结果,但编写的代码看起来怪怪的,也不太美观,有没有更美观的编写方式?在交互模式下尝试如下:

>>> print('今天的空气质量比昨天提升了:%.2f%%' % 1.23)
今天的空气质量比昨天提升了:1.23%

由输出结果可以看到,用上面这种方式也得到了想要的结果。不过从输入代码中可以看到,字符f后面使用了两个百分号(%),打印出来的结果只有一个百分号(%),这是怎么回事?

在Python中,字符串格式转化时,遇到的第一个百分号(%)指的是转换说明符,如果要输出百分号这个字符,就需要使用%%的形式才能得到百分号字符(%)。使用%%这种方式的效果如下:

>>> print('输出百分号:%s' % '%')
输出百分号:%