一、 引言
上节介绍了使用百分号占位符的字符串格式化方法,看起来功能很强大,但存在两个问题:
1、 在字符串格式化时必须知道变量的类型才能调用相应的格式化类型编码(如%s,也称为转换说明符),当变量类型发生变化时,需要一个个去查找格式化字符串修改对应的格式化类型编码;
2、 当格式化字符串的百分号占位符比较多时,不容易找到占位符与后面真实值之间的对应关系。
模板字符串的这种解决方案就是为了解决这两个问题提出的。
二、 模板字符串的操作方法
1. 从string模块引入模板方法
from string import Template
2. 将格式化字符串作为参数传入Template方法中创建字符串模板
此处的格式化字符串与上节的要求不同,要求使用$作为格式符,后面跟真实值对应的名字,这个名字称为“关键字参数”,这个名字必须符合Python变量命名的规范,如不能是数字、保留字,要易于记忆、好使用,跟真实值的变量名没有一致性要求,但一般为了程序可读性都会使用真实值的变量值或键值,没有其他要求。
语法:模板=Template(格式化字符串)
注意:如果格式化字符串原来就包含$符号,与格式符对$符号的使用冲突,此时用两个$符号(这个是老猿根据Python对百分号和反斜杠的处理联想出来的,一试果然如此)来表示是字符$,不是格式符。因此如果关键字参数前出现了两个$符号,则系统不再将后面的名字作为关键字参数,而作为普通字符串处理。这种处理在程序执行过程替换真实值过程不会报语法错误。
3. 使用真实值替换关键字参数
语法:模板.substitute(关键字参数1=真实值1,关键字参数2=真实值2……)
4. 举例
以上节的学生信息输出为例:
1) 正确案例
from string import Template as T #导入模板方法命名为T
student={'name':'小明','class':'20190301','score':597.5}
#格式化串,注意用了classno而没有用class,因为class是保留字
s='$classno 班 $name 同学,总分:$score'
#定义模板,其实可以直接将字符串作为参数不存储到s再传入,存储到s可以看看处理前后s是否有变化
tmp=T(s)
#执行替换,输出为格式化后的串,原串s保持不变
tmp.substitute (name=student['name'],classno=student['classno'],score=student['score'])
#输出为:20190301 班 小明 同学,总分:597.5
2) 使用$错误的案例
a) s='$$classno 班 $name 同学,总分:$score'
以上格式化字符串执行替换后结果成为了:
'$classno 班 小明 同学,总分:597.5'
系统并没有报错,两个$作为一个字符输出,后面的关键字参数也被作为字符串原样输出,同时说明替换时多传数据是没问题的。
b) s='$classno 班 $name 同学,$总分:$score'
字符串‘总分前’有单独的$符号,在执行替换时系统报错。
3) 以上案例执行代码截屏
本节介绍了通过模板字符串方法进行格式化输出的方法,这个方法能解决使用百分号占位符的字符串格式化的部分问题,但也带来了新的问题,就是无法指定宽带、精度、对齐方式等格式化输出常用的格式控制,同时使用单独的替换语句比直接格式化显得复杂。后面章节再继续介绍字符串格式化的更多更好的方法。
老猿Python系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。该系列文章同步发表于:
http://blog.sina.com.cn/learnpython 注:新浪暂停了pc的博客更新,等恢复后补齐
http://laoyuanpython.lofter.com/
https://me.csdn.net/LaoYuanPython
由于csdn对技术文章的支持度最好,推荐大家访问csdn。欢迎大家批评指正,谢谢大家关注!