format 是是 python2.6 新增的一个格式化字符串的方法, 相对于老版的 % 格式方法, 它有很多优点
1. 不需要理会数据类型的问题, 在 % 方法中 %s 只能替代字符串类型
2. 单个参数可以多次输出, 参数顺序可以不相同
3. 填充方式十分灵活, 对齐方式十分强大
4. 官方推荐用的方式,% 方式将会在后面的版本被淘汰
format 的一个例子
print hello {0}.format(world)
会输出 hello world
format 的格式
- replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
- field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
- arg_name ::= [identifier | integer]
- attribute_name ::= identifier
- element_index ::= integer | index_string
- index_string ::= <any source character except "]"> +
- conversion ::= "r" | "s" | "a"
- format_spec ::= <described in the next section>
format_spec 的格式
- format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
- fill ::= <any character>
- align ::= "<" | ">" | "=" | "^"
- sign ::= "+" | "-" | " "
- width ::= integer
- precision ::= integer
- type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
应用:
一 填充
1. 通过位置来填充字符串
- print hello {0} i am {1}.format(Kevin,Tom) # hello Kevin i am Tom
- print hello {} i am {}.format(Kevin,Tom) # hello Kevin i am Tom
- print hello {0} i am {1} . my name is {0}.format(Kevin,Tom) # hello Kevin i am Tom . my name is Kevin
foramt 会把参数按位置顺序来填充到字符串中, 第一个参数是 0, 然后 1
也可以不输入数字, 这样也会按顺序来填充
同一个参数可以填充多次, 这个是 format 比 % 先进的地方
2. 通过 key 来填充
print hello {name1} i am {name2}.format(name1=Kevin,name2=Tom) # hello Kevin i am Tom
3. 通过下标填充
- names=[Kevin,Tom]
- print hello {names[0]} i am {names[1]}.format(names=names) # hello Kevin i am Tom
- print hello {0[0]} i am {0[1]}.format(names) # hello Kevin i am Tom
4. 通过字典的 key
- names={name:Kevin,name2:Tom}
- print hello {names[name]} i am {names[name2]}.format(names=names) # hello Kevin i am Tom
注意访问字典的 key, 不用引号的
5. 通过对象的属性
- class Names():
- name1=Kevin
- name2=Tom
- print hello {names.name1} i am {names.name2}.format(names=Names) # hello Kevin i am Tom
6. 使用魔法参数
- args=[lu]
- kwargs = {name1: Kevin, name2: Tom}
- print hello {name1} {} i am {name2}.format(*args, **kwargs) # hello Kevin i am Tom
二 格式转换
bdox 分别是二进制十进制八进制十六进制
数字 | 格式 | 输出 | 描述 |
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
25 | {0:b} | 11001 | 转换成二进制 |
25 | {0:d} | 25 | 转换成十进制 |
25 | {0:o} | 31 | 转换成八进制 |
25 | {0:x} | 19 | 转换成十六进制 |
三 对齐与填充
数字 | 格式 | 输出 | 描述 |
5 | {:0>2} | 05 | 数字补零 (填充左边, 宽度为 2) |
5 | {:x<4} | 5xxx | 数字补 x (填充右边, 宽度为 4) |
10 | {:x^4} | x10x | 数字补 x (填充右边, 宽度为 4) |
13 | {:10} | 13 | 右对齐 (默认, 宽度为 10) |
13 | {:<10} | 13 | 左对齐 (宽度为 10) |
13 | {:^10} | 13 | 中间对齐 (宽度为 10) |
四 其他
1. 转义 {和} 符号
print {{ hello {0} }}.format(Kevin)
跟 % 中 %% 转义 % 一样, formate 中用两个大括号来转义
2.format 作为函数
- f = hello {0} i am {1}.format
- print f(Kevin,Tom)
3. 格式化 datetime
- now = datetime.now() print {: %Y - %m - %d % X
- }.format(now)
4.{}内嵌{}
print hello {0:>{1}} .format(Kevin,50)
5. 叹号的用法
! 后面可以加 s r a 分别对应 str() repr() ascii()
作用是在填充前先用对应的函数来处理参数
- print "{!s}".format(2) # 2
- print "{!r}".format(2) # 2
差别就是 repr 带有引号, str()是面向用户的, 目的是可读性, repr()是面向 python 解析器的, 返回值表示在 python 内部的含义
ascii()一直报错, 可能这个是 3.0 才有的函数
来源: http://www.bubuko.com/infodetail-2491530.html