format使用
最近公司推崇测试和开发不分家,测试也需要将脚本写得更加鲁棒性,更好维护,一位测试的同事没怎么写过python,来问我一个问题:
def demo(a, b, c, d):
print("\
This is a's name: %s\n\
Please change b's name: %s\n\
This is c's name: %s\n\
This is d's name: %s\n" %(a, b, c, d))
demo("a", "b", "c", "d")
这样一个函数如何更好维护(看来测试美眉也是很爱学习的嘛😝,实际上该函数有十多个参数用于构建该字符串),我思考了一下,想到可以用format
来优化一下代码:
def demo(a, b, c, d):
command = "\n".join([
"This is a's name:{a}".format(a=a),
"Please change b's name: {b}".format(b=b),
"This is c's name: {c}".format(c=c),
"This is d's name: {d}".format(d=d),
])
print(command)
demo("apple", "banana", "candy", "dog")
测试美眉看到重构之后的效果表示非常开心地走开了。但是她走之后,我想难道这样format
就被她掌握了,岂不是太小瞧format
了,于是又重新研究了一波format
,简单整理了一下。
参数传递方式
默认方式:默认方式就是将format
后的参数依次插入到字符串相应位置
>>> "a:{},b:{}".format("apple","banana")
'a:apple,b:banana'
索引方式:索引就是利用字符串中的{index}
对应format
中的参数,分别插入到字符串相应位置:
>>> "a:{1},b:{0}".format("apple","banana")
'a:banana,b:apple'
>>> "a:{0},b:{1}".format("apple","banana")
'a:apple,b:banana'
>>> "a:{0[1]},b:{1}".format(["apple","apple2"],"banana")
'a:apple2,b:banana'
key-value:类似函数传参方式:
>>> "a:{b},b:{a}".format(a="apple", b="banana")
'a:banana,b:apple'
>>> "a:{a},b:{b}".format(a="apple", b="banana")
'a:apple,b:banana'
填充方法:下面分别是左对齐、中间对齐和右对齐三种方式,具体格式是:[填充字符][对齐方式 <^>][宽度]:
>>> "left:{a:*<10}, mid:{a:*^10}, right:{a:*>10}".format(a="5")
'left:5*********, mid:****5*****, right:*********5'
当然format
同样支持格式化输出:
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" | "%"
整数输出类型:
字符 | 含义 |
---|---|
b | 以二进制格式输出 |
c | 将整数转换成对应的 unicode 字符 |
d | 以十进制输出(默认选项) |
o | 以八进制输出 |
x | 以十六进制小写输出 |
X | 以十六进制大写输出 |
n | 与 d 相同,但使用当前环境的分隔符来分隔每3位数字 |
十进制浮点数输出类型:
字符 | 含义 |
---|---|
e | 指数标记;使用科学计数法输出,用e来表示指数部分,默认 precision 为6 |
E | 与 e 相同,但使用大写 E 来表示指数部分 |
f | 以定点形式输出数值,默认 precision 为6 |
F | 与 f 相同,转换nan 到NAN ,inf 到INF
|
g | 通用格式;对于给定的 precision p >= 1,取数值的p位有效数字,并以定点或科学计数法输出(默认选项) |
G | 通用格式;与 g 相同,当数值过大时使用 E 来表示指数部分 |
n | 与 g 相同,但使用当前环境的分隔符来分隔每3位数字 |
% | 百分比标记;使用百分比的形式输出数值,同时设定 f 标记 |
>>> "a:{a:.2f},b:{a:.3%},c:{a:*<10.3f},d:{a:.4e}".format(a=12.333333)
'a:12.33,b:1233.333%,c:12.333****,d:1.2333e+01'
小结
format还是非常强大的,还具有替换功能,这里没有列出来。
网友评论