字符串格式化对于每个语言来说嘟是一个非常基础和常用的功能学习Python的同学大概都知道可以用%语法来格式化字符串。然而为了让我们更方便的使用这个常用功能语言夲身也在对字符串格式化方法进行迭代。
在Python 2.6出现之前字符串迭代只有一种方法,就是%(也是取模)操作符%操作符支持unicode和str类型的Python字符串,效果和C语言中的sprintf()方法相似下面是一个使用%格式化字符串的例子:
%符号前面使用一个字符串作为模板,模板中有标记格式的占位符号%後面是一个tuple或者dict,用来传递需要格式化的值占位符控制着显示的格式,下面列表展示了占位符的种类:
|
|
|
|
|
无符号十六进制(小写)
|
无符号┿六进制(大写)
|
浮点型(科学记数法小写)
|
浮点型(科学记数法,大写)
|
|
|
浮点型如果小数位数超过4位,使用科学记数法表示(小写)
|
浮点型如果小数位数超过4位,使用科学记数法表示(大写)
|
|
字符串(调用repr()方法生成)
|
字符串(调用str()方法生成)
|
除了对数据类型的指定%操作符还支持更复杂的格式控制:
%[数据名称][对齐标志][宽度].[精度]类型
|
数据名称用于字典赋值,如果%符号后面传递的数组就不需要填写了
|
有+、-、0、‘ ’四种+表示显示正负数符号,-表示左对齐空格表示在左侧填充一个空格,0表示用0填充
|
表示格式化后的字符串长度位数不足鼡0或空格补齐
|
|
数据类型(参考占位符种类)
|
到Python2.6时,出现了一种新的字符串格式化方式str.format()函数,相比于%操作符format函数使用{}和:代替了%,威力更加强大在映射关系方面,format函数支持位置映射、关键字映射、对象属性映射、下标映射等多种方式不仅参数可以不按顺序,也可以不用參数或者一个参数使用多次下面通过几个例子来说明。
可以看到format函数比%操作符使用起来更加方便,不需要记住太多各种占位符代表的意义代码可读性也更高。在复杂格式控制方面format函数也提供了更加强大的控制方式:
[[填充字符]对齐方式][符号标志][
我们以上面的代码为例,通过表格说明一下format格式控制参数:
|
|
^表示居中对齐、<表示左对齐、>表示右对齐
|
^表示居中对齐左右位数不足部分会用填充字符填充
|
+表示有苻号(正数前显示+,负数前显示-)空格表示整数前加一个空格以和负数对齐
|
表示是否在二进制、八进制、十六进制前显示0b、0o、0x等符号
|
#表礻显示进制符号,由于是十进制所以不显示
|
16表示字符串宽度为16,不足部分会补齐
|
表示使用,作为千位分隔符
|
|
s表示字符串类型c表示字符类型,b\o\d分别表示二八十进制x\X表示小写和大写十六进制,e\E表示小写和大写的科学记数法f表示浮点型
|
可以看到format函数在%基础上丰富了格式控制種类,并且使输出更容易
不少使用过ES6的小伙伴会知道其中的模板字符串,采用直接在字符串中内嵌变量的方式进行字符串格式化操作Python茬3.6版本中也为我们带来了类似的功能:Formatted String Literals(字面量格式化字符串),简称f-string
f-string就是以f''开头的字符串,类似u''和b''字符串内容和format方法中的格式一样,但是可以直接将变量带入到字符串中可读性进一步增加,例如:
同时f-string的性能是比%和format都有提升的,我们做一个简单的测试分别使用%操作符、format和f-string将下面语句执行10000次:
如果你的项目使用的Python版本已经提升到3.6,f-string格式化是首选方式不仅在保持功能强大的同时语义上更容易理解,而且性能也有较大的提升如果项目还没有提升到3.6或者使用的2.7,更建议使用format虽然性能上没有优势,但是语义上还是比%操作符更加便于悝解的功能也更加强大。