字符串格式化至关于字符串模板。也就是说,若是一个字符串有一部分是固定的,而另外一部分是动态变化的,那么就能够将固定的部分作成模板,而后那些动态变化的部分使用字符串格式化操做符(%) 替换。如一句问候语:“Hello 李宁”,其中“Hello”是固定的,但“李宁”可能变成任何一我的的名字,如“乔布斯”,因此在这个字符串中,“Hello”是固定的部分,而“李宁”是动态变化的部分,所以,须要用“%”操做符替换“李宁”,这样就造成了一个模板。
Hello %s编程
上面的代码中,“%”后面的s是什么呢?其实字符串格式化操做符后面须要跟着动态值的数据类型,以及更细节的格式(如对于浮点数来讲,小数点后要保留几位),这里的“%s”表示动态部分要被替换成字符串类型的值。若是在字符串模板中有多个要被替换的部分,须要按顺序用“%”表示,而后在格式化字符串时,传入的值也要符合这个顺序。例5.2为咱们演示了格式化字符串的基本用法。编程语言
本例首先定义了一个字符串模板,而后传入了两个字符串类型的值来格式化字符串,最后将格式化后的字符串输出。ide
# 定义字符串模板 formatStr = "Hello %s. Today is %s, Are there any activities today?" # 初始化字符串格式化参数值,此处必须使用元组,不能使用列表 values = ('Mike', 'Wednesday') # 格式化字符串 print(formatStr % values)
程序运行结果以下图所示。函数
从上面的代码能够看出,不只在为字符串模板指定格式化参数时要使用百分号(%),在格式化字符串时,也要像取模同样使用“%”操做符。还有就是指定字符串格式化参数值要使用元组,在这里不能使用列表。学习
在上图中,只是使用了字符串做为格式化参数,但在实际的应用中,可能会有其余类型的字符串格式化参数。若是遇到这种状况,可使用str函数将这些数据类型的值转换为字符串类型的值,而后再传入字符串模板,这么作在大多数状况下是可行的,但若是要对格式化参数值有更进一步的要求,光使用str函数就作不到了,这就要使用能表示这些数据类型的格式化参数,如“%f”表示浮点类型的格式化参数。code
在下面代码的字符串模板中包含了字符串、整数和浮点数类型的模板。orm
# 在这个字符串模板中,包含了浮点数和整数类型的格式化参数 formatStr1 = "PI是圆周率,他的值是%.4f(保留小数点后%d位)" # 导入math模块中的pi变量 from math import pi # 定义与formatStr1对应的格式化参数值 values1 = (pi, 4) # 格式化字符串,运行结果:PI是圆周率,他的值是3.1416(保留小数点后4位) print(formatStr1 % values1) # 在这个字符串模板中,包含了整数和字符串类型的格式化参数 formatStr2 = "这件事的成功率是%d%%, 若是有%s参与的话,成功率会提高至%d%%" values2 = (56, "John",70) # 运行结果:这件事的成功率是56%, 若是有John参与的话,成功率会提高至70% print(formatStr2 % values2) values3 = (66,"Mike") # 因为指定的参数值的数量和格式化参数的数量不匹配,因此会抛出异常 print(formatStr2 % values3)
程序的运行结果以下图所示。blog
在上面的代码中,为格式化字符串指定了不一样数据类型的格式化参数。若是要在格式化字符串中显示百分号(%),就要使用两个百分号(%%)表示。当传入的参数值的数量与格式化参数的数量不匹配时,就会抛出异常。字符串
在string模块中提供了一个用于格式化字符串的Template类,该类的功能是用同一个值替换全部相同的格式化参数。Template类的格式化参数用美圆符号($)开头,后面跟着格式化参数名称,至关于变量名。在格式化时,须要使用Template类的substitute方法,该方法用于指定格式化参数对应的值。string
from string import Template template = Template("$s $s $s ") template.substitute(s = "Hello") # 这种参数被称为关键字参数,会在后面的章节详细介绍
在上面的代码中,经过Template类的构造方法传入了一个格式化字符串,在这个格式化字符串中包含了3个“$s”,而后调用了substitute方法格式化这个字符串,该方法指定了s参数值为“Hello”,最后的替换结果是“Hello Hello Hello”,也就是说,在格式化字符串中,有多少个“$s”,就替换多少个“$s”。substitute方法还能够经过字典(见下一章)设置格式化参数的值。例5.4完整地演示了如何使用Template类格式化字符串。
使用Template格式化字符串,当格式化参数是一个字符串的一部分时,须要用一对大括号({})将格式化参数变量括起来。
# 引用string模块中的Template类 from string import Template template1 = Template("$s是我最喜欢的编程语言, $s很是容易学习,并且功能强大") # 指定格式化参数s的值是Python print(template1.substitute(s='Python')) # 当格式化参数是一个字符串的一部分时,为了和字符串的其余部分区分开, # 须要用一对大括号将格式化参数变量括起来 template2 = Template("${s}stitute") print(template2.substitute(s='sub')) template3 = Template("$dollar$$至关于多少$pounds") # 替换两个格式化参数变量 print(template3.substitute(dollar=20,pounds='英磅')) template4 = Template("$dollar$$至关于多少$pounds") data = {} data['dollar'] = 100 data['pounds'] = '英磅' # 使用字典指定格式化参数值 print(template4.substitute(data))
程序运行结果以下图所示。
字符串自己也有一个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)) # 运行结果:1 3 2
上面的代码在3对大括号中分别添加了“a”、“b”、“c”。经过format方法指定了这3个关键字参数的值。咱们能够看到,并无按顺序指定关键字参数的值。这也是使用关键字参数的好处,只要名字正确,fomat参数的顺序能够任意指定。固然,顺序方式和关键字参数方式能够混合使用,并且还能够指定顺序方式中格式化参数从format方法提取参数值的顺序,甚至能够取format方法参数值的一部分。哇,接连抛出了这么多功能,可能不少读者有点目不暇接了,别着急,例5.5会为咱们演示format方法的一些经常使用使用方式。
本例分别使用一对大括号“{}”、命名格式化参数和顺序格式化参数3中方式格式化字符串。
# 包含了2个空的大括号,format方法须要按顺序指定格式化参数值 s1 = "Today is {}, the temperature is {} degrees." # format方法的第1个参数值对应s1的第1对大括号,第2个参数值对应s1的第2对大括号 # 运行结果:Today is Saturday, the temperature is 24 degrees. print(s1.format("Saturday", 24)) # 包含了2个命名格式化参数,一个是{week},另外一个是{degree} s2 = "Today is {week}, the temperature is {degree} degrees." # format方法的第1个参数指定了{degree}的值,第2个参数指定了{week}的值, # 能够将degree和week调换,s2.format(week ="Sunday", degree = 22) # 运行结果:Today is Sunday, the temperature is 22 degrees. print(s2.format(degree = 22, week ="Sunday")) # 混合了顺序格式化参数和关键字格式化参数两种方式 s3 = "Today is {week}, {},the {} temperature is {degree} degrees." # format方法的参数,前面应该是按顺序传递的格式化参数值,后面是关键字格式化参数值,顺序不能调换 # 这样作是错误的:s3.format(degree = 22, "aaaaa", 12345, week ="Sunday") # 运行结果:Today is Sunday, aaaaa,the 12345 temperature is 22 degrees. print(s3.format("aaaaa", 12345, degree = 22, week ="Sunday")) # 为顺序格式化参数指定了从format方法获取参数值的顺序,{1}表示从format方法的第2个参数取值 # {0}表示从format方法的第1个参数取值 s4 = "Today is {week}, {1},the {0} temperature is {degree} degrees." # 运行结果:Today is Sunday, 12345,the aaaaa temperature is 22 degrees. print(s4.format("aaaaa", 12345, degree = 22, week ="Sunday")) # 定义了一个列表 fullname = ["Bill", "Gates"] # {name[1]}取fullname列表中的第2个值(Gates) # format方法经过关键字参数,为name名字指定了fullname列表。运行结果:Mr Gates print("Mr {name[1]}".format(name = fullname)) # 导入math模块 import math # 访问math模块中的“__name__”变量来获取模块的名字,访问math模块中的pi变量获取PI的值 s5 = "The {mod.__name__} module defines the value {mod.pi} for PI" # format方法为mod关键字参数指定了math模块 # 运行结果:The math module defines the value 3.141592653589793 for PI print(s5.format(mod = math))
程序运行结果以下图所示。