自 2.6 以后 Python 增加一个新函数 str.format()
来增加字符串格式化的功能
本篇不再对比它跟 %
的用法,本着用新不用旧原则,我们只看新函数的一些用法。基础
1 2 3
| >>> '{} {}'.format('hello', 'world') # hello world >>> '{0} {1}'.format('hello', 'world') # hello world >>> '{1} {0}'.format('hello', 'world') # world hello
|
参数
1 2 3 4 5 6 7 8 9 10
| >>> '{name} {age}'.format(name='wxnacy', age=0) # wxnacy 0 # dict >>> kwargs = dict(name='wxnacy', age=0) >>> '{name} {age}'.format(**kwargs) # wxnacy 0 >>> '{p[name]} {p[age]}'.format(p=kwargs) # wxnacy 0 # list >>> args = [1, 2] >>> '{0} {1}'.format(*args) # 1 2 >>> '{0[0]} {0[1]}'.format(args) # 1 2 >>> '{p[0]} {p[1]}'.format(p=args) # 1 2
|
数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| # 保留小数点2位 >>> '{:.2f}'.format(3.1415926) # 3.14 # 取整 >>> '{:.0f}'.format(3.1415926) # 3 # 保留数字符号 >>> '{:+.2f}'.format(3.1415926) # +3.14 >>> '{:+.2f}'.format(-3.1415926) # -3.14 # 对齐 >>> '{:5d}'.format(3) # 3 >>> '{:<5d}'.format(3) # 3 >>> '{:^5d}'.format(3) # 3 # 对齐并补位 >>> '{:0>5d}'.format(3) # 00003 >>> '{:0<5d}'.format(3) # 30000 >>> '{:0^5d}'.format(3) # 00300 # 以逗号分隔的数字格式 >>> '{:,}'.format(1000000) # 1,000,000 # 百分比格式 >>> '{:.2%}'.format(0.25) # 25.00% # 指数 >>> '{:.2e}'.format(1000000000) # 1.00e+09 # 进制 >>> '{:b}'.format(11) # 1011 >>> '{:d}'.format(11) # 11 >>> '{:o}'.format(11) # 13 >>> '{:x}'.format(11) # b >>> '{:#x}'.format(11) # 0xb >>> '{:#X}'.format(11) # 0xB
|
字符串
1 2 3 4 5 6 7 8 9 10
| # 截取 >>> '{:.3}'.format('wxnacy') # wxn # 截取并对齐 >>> '{:6.3}'.format('wxnacy') # wxn >>> '{:>6.3}'.format('wxnacy') # wxn >>> '{:^6.3}'.format('wxnacy') # wxn # 截取并对齐并占位 >>> '{:0<6.3}'.format('wxnacy') # wxn000 >>> '{:0>6.3}'.format('wxnacy') # 000wxn >>> '{:0^6.3}'.format('wxnacy') # 0wxn00
|
时间
1 2 3 4 5 6
| >>> from datetime import datetime >>> dt = datetime.now() >>> '{:%Y-%m-%d %H:%M:%S.%s}'.format(dt) >>> '2018-01-03 18:41:52.1514976112' >>> '{:{dfmt} {tfmt}}'.format(dt, dfmt='%Y-%m-%d', tfmt='%H:%M:%S.%s') >>> '2018-01-03 18:41:52.1514976112'
|
对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy([email protected])
class User(): def __init__(self): self.name = 'wxnacy'
def __str__(self): return self.name
def __repr__(self): return 'räpr'
def __format__(self, fmt): if fmt == 'fmt': return "I'm format user" return 'user'
if __name__ == "__main__": u = User() print('{:fmt}'.format(u)) # I'm format user print('{!s}'.format(u)) # wxnacy print('{!r}'.format(u)) # räpr print('{!a}'.format(u)) # r\xe4pr
|
转义
1 2 3
| >>> '{} position is {{0}}'.format('a') # a position is {0} # {{ 来显示左大括号 # }} 来显示右大括号
|
参考
官方文档并没有明确给出要删除老方法 %
,也没有说过新的方法速度会比较快,但是它已经有很多功能是 %
不支持的了,并且在以后官方也会慢慢只维护新函数,而这种格式化方式也比较适合函数式应用,所以建议都采用这种方式。