Python基础教程:格式化字符串
1. 字符串格式化基础
字符串格式化相当于字符串模板。也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(%) 替换。如一句问候语:“Hello 李宁”,其中“Hello”是固定的,但“李宁”可能变成任何一个人的名字,如“乔布斯”,所以在这个字符串中,“Hello”是固定的部分,而“李宁”是动态变化的部分,因此,需要用“%”操作符替换“李宁”,这样就形成了一个模板。
Hello %s
上面的代码中,“%”后面的s是什么呢?其实字符串格式化操作符后面需要跟着动态值的数据类型,以及更细节的格式(如对于浮点数来说,小数点后要保留几位),这里的“%s”表示动态部分要被替换成字符串类型的值。如果在字符串模板中有多个要被替换的部分,需要按顺序用“%”表示,然后在格式化字符串时,传入的值也要符合这个顺序。例5.2为我们演示了格式化字符串的基本用法。
本例首先定义了一个字符串模板,然后传入了两个字符串类型的值来格式化字符串,最后将格式化后的字符串输出。

程序运行结果如下图所示。

从上面的代码可以看出,不仅在为字符串模板指定格式化参数时要使用百分号(%),在格式化字符串时,也要像取模一样使用“%”操作符。还有就是指定字符串格式化参数值要使用元组,在这里不能使用列表。
在上图中,只是使用了字符串作为格式化参数,但在实际的应用中,可能会有其他类型的字符串格式化参数。如果遇到这种情况,可以使用str函数将这些数据类型的值转换为字符串类型的值,然后再传入字符串模板,这么做在大多数情况下是可行的,但如果要对格式化参数值有更进一步的要求,光使用str函数就做不到了,这就要使用能表示这些数据类型的格式化参数,如“%f”表示浮点类型的格式化参数。
在下面代码的字符串模板中包含了字符串、整数和浮点数类型的模板。

程序的运行结果如下图所示。

在上面的代码中,为格式化字符串指定了不同数据类型的格式化参数。如果要在格式化字符串中显示百分号(%),就要使用两个百分号(%%)表示。当传入的参数值的数量与格式化参数的数量不匹配时,就会抛出异常。
模板字符串
在string模块中提供了一个用于格式化字符串的Template类,该类的功能是用同一个值替换所有相同的格式化参数。Template类的格式化参数用美元符号($)开头,后面跟着格式化参数名称,相当于变量名。在格式化时,需要使用Template类的substitute方法,该方法用于指定格式化参数对应的值。

在上面的代码中,通过Template类的构造方法传入了一个格式化字符串,在这个格式化字符串中包含了3个“KaTeX parse error: Expected 'EOF', got '”' at position 2: s”̲,然后调用了substitut…s”,就替换多少个“$s”。substitute方法还可以通过字典(见下一章)设置格式化参数的值。例5.4完整地演示了如何使用Template类格式化字符串。
使用Template格式化字符串,当格式化参数是一个字符串的一部分时,需要用一对大括号({})将格式化参数变量括起来。

程序运行结果如下图所示。

字符串的format方法
字符串本身也有一个format方法用于格式化当前的字符串。这个format方法和前面讲的格式化操作符(%)不太一样。字符串格式化参数并不是用百分号(%)表示,而是用一对大括号({}),而且支持按顺序指定格式化参数值和关键字格式化参数。例如,下面的代码通过format方法按顺序为格式化字符串指定了参数值。
print("{} {} {}".format(1,2,3)) # 运行结果:1 2 3
我们可以看到,上面的代码在字符串中指定了3对空的大括号,这代表3个格式化参数,不需要指定数据类型,可以向其传递Python语言支持的任何值。通过format方法传入3个值(1,2,3),这3个值会按顺序替换格式化字符串中的3对空的大括号。
命名格式化参数是指在一对大括号中指定一个名称,然后调用format方法时也要指定这个名称。
print("{a} {b} {c}".format(a =1,c =2,b =3)) # 运行结果:132
上面的代码在3对大括号中分别添加了“a”、“b”、“c”。通过format方法指定了这3个关键字参数的值。我们可以看到,并没有按顺序指定关键字参数的值。这也是使用关键字参数的好处,只要名字正确,fomat参数的顺序可以任意指定。当然,顺序方式和关键字参数方式可以混合使用,而且还可以指定顺序方式中格式化参数从format方法提取参数值的顺序,甚至可以取format方法参数值的一部分。哇,接连抛出了这么多功能,可能很多读者有点应接不暇了,别着急,例5.5会为我们演示format方法的一些常用使用方式。
本例分别使用一对大括号“{}”、命名格式化参数和顺序格式化参数3中方式格式化字符串。

程序运行结果如下图所示。
