字符串格式化对于每一个语言来讲都是一个很是基础和经常使用的功能,学习Python的同窗大概都知道能够用%语法来格式化字符串。然而为了让咱们更方便的使用这个经常使用功能,语言自己也在对字符串格式化方法进行迭代。python
在Python 2.6出现以前,字符串迭代只有一种方法,就是%(也是取模)操做符,%操做符支持unicode和str类型的Python字符串,效果和C语言中的sprintf()方法类似,下面是一个使用%格式化字符串的例子:数组
print("I'm %s. I'm %d year old" % ('Tom', 27))
%符号前面使用一个字符串做为模板,模板中有标记格式的占位符号,%后面是一个tuple或者dict,用来传递须要格式化的值。占位符控制着显示的格式,下面列表展现了占位符的种类:函数
占位符 | 内容 |
---|---|
%d | 十进制整数 |
%i | 十进制整数 |
%o | 八进制整数 |
%u | 无符号整数 |
%x | 无符号十六进制(小写) |
%X | 无符号十六进制(大写) |
%e | 浮点型(科学记数法,小写) |
%E | 浮点型(科学记数法,大写) |
%f | 浮点数 |
%F | 浮点数 |
%g | 浮点型,若是小数位数超过4位,使用科学记数法表示(小写) |
%G | 浮点型,若是小数位数超过4位,使用科学记数法表示(大写) |
%c | 单个字符 |
%r | 字符串(调用repr()方法生成) |
%s | 字符串(调用str()方法生成) |
除了对数据类型的指定,%操做符还支持更复杂的格式控制:性能
%[数据名称][对齐标志][宽度].[精度]类型
名称 | 内容 |
---|---|
数据名称 | 数据名称用于字典赋值,若是%符号后面传递的数组就不须要填写了 |
对齐标志 | 有+、-、0、‘ ’四种,+表示显示正负数符号,-表示左对齐,空格表示在左侧填充一个空格,0表示用0填充 |
宽度 | 表示格式化后的字符串长度,位数不足用0或空格补齐 |
精度 | 小数点后的位数 |
类型 | 数据类型(参考占位符种类) |
例如print('%053f' % '12.34')会输出0012.340学习
到Python2.6时,出现了一种新的字符串格式化方式,str.format()函数,相比于%操做符,format函数使用{}和:代替了%,威力更增强大,在映射关系方面,format函数支持位置映射、关键字映射、对象属性映射、下标映射等多种方式,不只参数能够不按顺序,也能够不用参数或者一个参数使用屡次,下面经过几个例子来讲明。测试
'{1} {0}'.format('abc', 123) # 能够不按顺序进行位置映射,输出'123 abc' '{} {}'.format('abc', 123) # 能够不指定参数名称,输出'abc 123' '{1} {0} {1}'.format('abc', 123) # 参数可使用屡次,输出'123 abc 123' '{name} {age}'.format(name='tom', age=27) # 能够按关键字映射,输出'tom 27' '{person.name} {person.age}'.format(person=person) # 能够按对象属性映射,输出'tom 27' '{0[1]} {0[0]}'.format(lst) # 经过下标映射
能够看到,format函数比%操做符使用起来更加方便,不须要记住太多各类占位符表明的意义,代码可读性也更高。在复杂格式控制方面,format函数也提供了更增强大的控制方式:spa
[[填充字符]对齐方式][符号标志][#][宽度][,][.精度][类型]
例如:code
'{:S^+#016,.2f}'.format(1234) # 输出'SSS+1,234.00SSSS'
咱们以上面的代码为例,经过表格说明一下format格式控制参数:orm
类型 | 说明 | 示例说明 |
---|---|---|
填充字符 | 不填时默认用空格填充 | S表示用S填充 |
对齐方式 | ^表示居中对齐、<表示左对齐、>表示右对齐 | ^表示居中对齐,左右位数不足部分会用填充字符填充 |
符号标志 | +表示有符号(正数前显示+,负数前显示-),空格表示整数前加一个空格以和负数对齐 | +表示正数前显示空格 |
# | 表示是否在二进制、八进制、十六进制前显示0b、0o、0x等符号 | #表示显示进制符号,因为是十进制,因此不显示 |
宽度 | 表示输出字符串的宽度 | 16表示字符串宽度为16,不足部分会补齐 |
, | 表示使用,做为千位分隔符 | ,表示使用千位分隔符 |
精度 | 表示小数点后数字位数 | .2表示精度为2为 |
类型 | s表示字符串类型,c表示字符类型,bod分别表示二八十进制,xX表示小写和大写十六进制,eE表示小写和大写的科学记数法,f表示浮点型 | f表示浮点型数字 |
能够看到format函数在%基础上丰富了格式控制种类,而且使输出更容易。对象
很多使用过ES6的小伙伴会知道其中的模板字符串,采用直接在字符串中内嵌变量的方式进行字符串格式化操做,Python在3.6版本中也为咱们带来了相似的功能:Formatted String Literals(字面量格式化字符串),简称f-string。
f-string就是以f''开头的字符串,相似u''和b'',字符串内容和format方法中的格式同样,可是能够直接将变量带入到字符串中,可读性进一步增长,例如:
amount = 1234 f'请转帐给我{amount:,.2f}元' # '请转帐给我1,234.00元'
同时,f-string的性能是比%和format都有提高的,咱们作一个简单的测试,分别使用%操做符、format和f-string将下面语句执行10000次:
'My name is %s and i'm %s years old.' % (name, age) 'My name is {} and i'm {} years old.'.format(name, age) f'My name is {name} and i'm {age} years old.'
用时结果以下:
若是你的项目使用的Python版本已经提高到3.6,f-string格式化是首选方式,不只在保持功能强大的同时语义上更容易理解,并且性能也有较大的提高。若是项目尚未提高到3.6或者使用的2.7,更建议使用format,虽然性能上没有优点,可是语义上仍是比%操做符更加便于理解的,功能也更增强大。