1.%操作符(所有版本都支持)
python2.6之前只支持这一种格式化方法。这类似于C语言的格式化方法。
1.1举个例子
>>> print("I'm %s. I'm %d year old" % ('Tom', 27))
I'm Tom. I'm 27 year old
>>> print("I'm %(name)s. I'm %(age)d year old" % {'name':'Tom', 'age':27})
I'm Tom. I'm 27 year old
说明:
%符号前面使用一个字符串作为模板,模板中有标记格式的占位符号(如%s,%d),%后面是一个tuple或者dict,用来传递需要格式化的值。
1.2占位符类型说明
1.3完整的占位符控制
%(数据名称)[对齐标志][宽度].[精度]类型
数据名称 | 数据名称用于字典赋值,如果%符号后面传的tuple就不需要填写了。注意在字符串内要用()括起来。 |
对齐标志 | 有 +\-\0\' ' 四种形式,+表示显示正负数符号,-表示左对齐,空格表示在左侧填充一个空格,0表示用0填充 |
宽度 | 表示格式化后的字符串总长度(也就是len(str),所以小数点也算在内),位数不足用0或空格补齐 |
精度 | 小数点后的位数 |
类型 | 请参考上一节 - 占位符类型说明 |
1.4几个例子
>>> print('%08.3f' % 12.34)
0012.340
>>> print('%(num)08.3f' % {"num":12.34})
0012.340
>>> print('%+08.3f' % 12.34)
+012.340
2. str.format (Python2.6及以后支持)
对比于%
威力更加强大,在映射关系方面,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函数比%操作符使用起来更加方便,不需要记住太多各种占位符代表的意义,代码可读性也更高
完整的占位符控制
[:填充字符][对齐方式][符号标志][#][宽度][,][.精度][类型]
说明:
类型 | 说明 | 示例说明 '{:S^+#016,.2f}'.format(1234) |
:填充字符 | 不填时默认用空格填充 | :S表示用S填充 |
对齐方式 | ^表示居中对齐, <表示左对齐, >表示右对齐 | ^表示居中对齐,左右位数不足部分会用填充字符 |
符号标志 | +表示有符号(正数前显示+,负数前显示-), 空格表示整数前加一个空格以和负数对齐 | +表示有符号 |
# | 表示在二进制、八进制、十六进制前显示0b,0o,0x等符号 | #表示显示进制符号,由于实例是十进制,所以输出没有特别的符号 |
宽度 | 表示输出字符串的宽度 | 016表示字符串总宽度为16,不足部分会使用填充字符补齐 |
, | 表示使用,作为干千位分符 | ,表示使用千位分隔符 |
精度 | 表示小数点后数字位数 | .2表示精度为2位 |
类型 | s表示字符串类型,c表示字符类型,f表示浮点型, eE表示小写和大写的科学记数法 0b 0o 0d分别表示二八十进制, xX表示小写和大写十六进制, | f表示浮点型 |
一些例子:
>>> '{:S^+#016,.2f}'.format(1234)
'SSS+1,234.00SSSS'
>>> '{:S^+#016b}'.format(1234)
'S+0b10011010010S'
>>> '{:S^+#016.2E}'.format(1234)
'SSS+1.23E+03SSSS'
3.f'string' (python3.6及之后版本支持)
f'string'就是以f''开头的字符串,类似u'string'和r'string',字符串内容和format方法中的格式一样,但是可以直接将变量带入到字符串中。
一些例子:
>>> f'{1234:S^+#016,.2f}'
'SSS+1,234.00SSSS'
>>> f'{1234:S^+#016b}'
'S+0b10011010010S'
>>> amount = 1234; f'请转账给我{amount:,.2f}元'
'请转账给我1,234.00元'
4.速度对比 (数据来自于参考链接)
5.总结
建议根据版本使用最新的字符串格式化方法,但其实很多项目有用% 和 format。总的来说都不是必须使用哪种方法,更应该考虑的是你的程序是否要进行版本兼容。