一、 引言
前面两节介绍的字符串格式化方法,都有其本身对应的缺陷,老猿不建议大家使用,之所以详细介绍主要是考虑历史代码的兼容性,方便大家理解前人留下的代码。老猿推荐大家新编码时使用format方法,因为该方法比前面2种方法更强大,也更容易理解。format方法是在Python2.6以后的版本才支持。
format格式字符串中使用大括号将格式符(也称为“转换说明符”、“替换字段”)括起来,对应的真实值通过format方法传递进来。format格式字符串有多种使用方法,我们接下来将逐一介绍。
二、 最简单的format方法进行字符串格式化
最简单的办法就是格式字符串中的每个格式符就是一个空的大括号,然后按照大括号出现的顺序逐一从format传入的参数中取值。
继续以上节的学生信息为例:
student={'name':'小明','class':'20190301','score':597.5}
print('{} 班 {} 同学,总分:{}'.format(student['class'],student['name'],student['score']))
或:
s='{} 班 {} 同学,总分:{}'
print(s.format(student['class'],student['name'],student['score']))
三、 使用索引方式的format方法进行字符串格式化
这里所说的索引就是format参数每个参数出现的顺序号,从0开始计数。在格式字符串中,格式符就是用大括号括起来的索引,因此无需按格式符出现顺序传入参数到format,也可以一个format参数在格式字符串中作为多个格式符对应真实值。
举例:
student={'name':'小明','class':'20190301','score':597.5}
print('{1} 班 {0} 同学,小名:{0},总分:{2}'.format(student['name'],student['class'], student['score']))
#输出:20190301 班 小明 同学,小名:小明,总分:597.5
上面介绍的最简单方法实际上是索引方式的一种特例,就是每个格式符内的索引自动在其前一个格式符基础加1,第一个格式符的索引为0。我们称上一种方式为自动编号索引format方法,而现在介绍的这种方法称为人工编号索引format方法。
注意:自动编号索引format方法和人工编号索引format方法二者不能混用!为什么呢?大家请想一想。
四、 使用关键字参数方式的format方法进行字符串格式化
使用关键字参数方式的format方法进行字符串格式化与使用模板字符串进行格式化方法的基础思想很像。
关键字参数方式就是在格式符内使用索引方式的format方法用索引的地方传入一个变量名,该变量名与使用模板字符串的$符号后面的关键字参数类似,后面在format参数中,使用:关键字参数=值的模式传入实际数据。
举例:
student={'name':'小明','class':'20190301','score':597.5}
print('{classno} 班 {name} 同学,小名:{name},总分:{score}'.format(classno=student['class'],name=student['name'],score=student['score']))
输出内容为:20190301 班 小明 同学,小名:小明,总分:597.5
注意:与模板字符串法类似,这里的关键字参数使用的是”classno”,而不是”class”。
五、 使用关键字参数变量的属性或元素的format方法进行字符串格式化
除了一个个指定真实值对应的关键字参数外,还有一种方法可以简化format的参数,就是在格式化字符串中用点“.”或中括号“[]”来引用一个变量的属性或元素,而format只需要传入该变量就可以。
举例:
student={'name':'小明','class':'20190301','score':597.5}
s1='{st[class]}班{st[name]}总分:{st[score]}'.format(st=student)
执行后s1的内容为: '20190301班小明总分:597.5'
六、 使用format_map方法进行字符串格式化
对使用字典作为关键字参数而格式化字符串中使用字典键值获取真实值的情况,除了使用前面介绍的2种方法,还可以使用format_map方法。相对format方法,有如下变化:
1、 调用方法从format改成了format_map;
2、 格式化字符串从“变量[键]”值方式变成了“键”方式;
3、 format_map的参数不需传入“关键字=真实值”,而是直接传入真实的字典值。
举例说明如下:
如上面使用format的方法如下:
student={'name':'小明','class':'20190301','score':597.5}
s1='{st[class]}班{st[name]}总分:{st[score]}'.format(st=student)
改用format_map方法后代码如下:
student={'name':'小明','class':'20190301','score':597.5}
s1='{class}班{name}总分:{score}'.format_map(student)
执行结果都是:'20190301班小明总分:597.5'
七、 f字符串格式化方法
在Python 3.6中,如果关键字参数变量与替换字段同名,还可使用一种简写。在这种情况下,可使用f字符串——在字符串前面加上f,后面无需加format调用。
举例:
classno,name,score=student['class'],student['name'],student['score']
s=f"{classno} 班 {name} 同学,小名:{name},总分:{score}" #注意使用的是classno
print(s) #输出:20190301 班 小明 同学,小名:小明,总分:597.5
这种方法也支持变量.属性、变量[索引]的方法传递数据。举例:
l=[1,2,3]
s=f'{l[0]}' #s=’1’
这种方法也支持真实值来源一个字典:
如: s=f”{student[‘name’]}”
注意这里“name”用了单引号,否则会报错。
以上介绍了四种使用format字符串格式化的方法,这些方法大部分不能混合使用,目前来看索引方式(包括自动编号与手动编号)与关键字参数方式可以混用,混用时使用索引的参数放在format参数的前面,关键字参数对应的真实值赋值表达式放在后面。总体来说老猿建议大家在一个字符串甚至一个模块中,尽量使用相同的字符串格式化方法。
老猿Python系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。