Python 格式化输出
【参考】:
Python中内容的格式化输出,有两种实现方法:
-
%字符串表达式
-
format()函数
1. %格式表达式
通过%格式表达式可以构建对象的格式化字符串输出。%表达式,由%分隔,左侧为格式字符串,由固定字符串和%开头的格式化样式组成,右侧为实际的对象,或对象元组。
>>> '%o' % 10
'12'
>>> '%.3f' % 0.1234
'0.123'
>>> '%-10s' % 'abcdefg'+'___'
'abcdefg ___'
>>> 'Sum = %d' % 5050
'Sum = 5050'
>>> 'Hello %s' % 'My Baby'
'Hello My Baby'
使用多%格式字符和对象元组,%格式表示可以包括多个格式化输出对象。
>>> '%d = %f' % (10,10.0)
'10 = 10.000000'
>>> '%s go to %s' % ('Tom','Shanghai')
'Tom go to Shanghai'
%常用格式符如下:
1.1 整数输出
%d |
整数的dec十进制格式 |
'%d' % 20 |
%o |
整数的oct八进制格式 |
'%o' % 20 |
%x |
整数的hex十六进制格式 |
'%x' % 20 |
>>> print('%d' % 20)
20
>>> print('%o' % 20)
24
>>> print('%x' % 20)
14
1.2 浮点数输出
%.nf |
浮点形式输出,保留n位小数,默认6位 |
'%.3f' % 0.1234 |
%.ne |
科学计数法形式输出,保留n位小数,默认6位 |
'%.3e' % 0.1234 |
%.ng |
整数和小数共保留n位,四舍五入。n大于整数位数时,输出浮点形式,n小于整数位数时,输出科学计数法形式。 |
'%g' % 123.1234 '%.2g' % 123.1234 |
>>> print('%f' % 0.1234)
0.123400
>>> print('%.3f' % 0.1234)
0.123
>>> print('%e' % 0.1234)
1.234000e-01
>>> print('%.3e' % 0.1234)
1.234e-01
>>> print('%.3e' % 1234.1234)
1.234e+03
>>> print('%g' % 123.1235)
123.124
>>> print('%.3g' % 123.1235)
123
>>> print('%.2g' % 123.1235)
1.2e+02
1.4 字符串输出
%s |
无格式字符串 |
'%s' % 'abcdefg' |
%ms |
右对齐,至少占m位 |
'%10s' % 'abcdefg' |
%-ms |
左对齐,至少占m位 |
'%-10s' % 'abcdefg' |
%.2s |
字符串从左截取n位 |
'%.2s' % 'abcdefg' |
%m.ns |
字符串从左截取n位,右对齐,至少占m位 |
'%10.2s' % 'abcdefg' |
%-m.ns |
字符串从左截取n位,左对齐,至少占m位 |
'%-10.2s' % 'abcdefg' |
>>> print('%s' % 'abcdefg'+'___')
abcdefg___
>>> print('%10s' % 'abcdefg'+'___')
abcdefg___
>>> print('%-10s' % 'abcdefg'+'___')
abcdefg ___
>>> print('%.2s' % 'abcdefg'+'___')
ab___
>>> print('%10.2s' % 'abcdefg'+'___')
ab___
>>> print('%-10.2s' % 'abcdefg'+'___')
ab ___
2. format()函数
format()函数拥有更强大的格式化输出能力,使用格式如下:
"format string with {} expr".format(*obj)
format()函数会对字符串模板中的{...}大括号部分,进行参数对象的匹配和替换。
需要注意的是,在字符串模板中,尽量不要出现{}左右大括号,如果一定要使用大括号,可以使用连续的大括号{{和}}来表示。
2.1 匹配替换
2.2.1 位置匹配
字符串模板中,直接使用{}一对大括号,与format()中的参数,按照大括号位置匹配。
>>> "{}".format(1)
'1'
>>> "Hello {}'s {}".format("Tom","cat")
"Hello Tom's cat"
>>> "{{Hello}} {}'s {}".format("Tom","cat")
"{Hello} Tom's cat"
2.2.2 编号匹配
{0},{1}...大括号中,可以加入format()中参数的编号,从0开始,但不可超过参数数量。如果字符串模板中,需要重复使用某个参数,则可以重复的编号。
>>> '{1} {0}'.format("cat","Tom")
'Tom cat'
>>> '{1} {0} {1}'.format("cat","Tom")
'Tom cat Tom'
>>> '{2} {0}'.format("cat","Tom")
Traceback (most recent call last):
File "<pyshell#86>", line 1, in <module>
'{2} {0}'.format("cat","Tom")
IndexError: Replacement index 2 out of range for positional args tuple
2.2.3 标签匹配
{tag1},{tag2}...大括号中,还可以使用标签加以区别,format()使用对tag赋值(tag1=value1,tag2=value2...)或字典**{'tag1':value1,'tag2'=value2...}形式传递参数。
>>> "Hello {person}'s {pet}".format(person="Tom",pet="cat")
"Hello Tom's cat"
>>> para={'person':'Tome','pet':'cat'}
>>> "Hello {person}'s {pet}".format(**para)
"Hello Tome's cat"
>>> "Hello {person}'s {pet}".format(**{'person':'Tome','pet':'cat'})
"Hello Tome's cat"
2.2.4 下标或key匹配
当format()中的参数为元组、列表或字典时,我们可以使用字符串模板中,使用下标0[0]或key 0[key]来指定引用关系。其中元组、列表或字典仍使用位置编号,如0,1...
>>> para=("Tome","cat")
>>> "Hello {0[0]}'s {0[1]}".format(para)
"Hello Tome's cat"
>>> "Hello {0[0]}'s {0[1]}".format(para)
"Hello Tome's cat"
>>> para={'person':'Tome','pet':'cat'}
>>> "Hello {0[person]}'s {0[pet]}".format(para)
"Hello Tome's cat"
2.2.5 对象属性匹配
在类定义中,可以使用self变量作为format()的参数,在字符串模板中,使用self.var方式调用对象的属性。
>>> class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self):
return 'Point({self.x}, {self.y})'.format(self=self)
>>> str(Point(4, 2))
'Point(4, 2)'
2.2 格式转换
利用format()方法除了做对象替换,还可以在{}大括号内,定义参数对象的输出格式。
>>> "{:.2f}".format(1)
'1.00'
>>> "{1:.2f} {0:.1f}".format(1,2)
'2.00 1.0'
>>> "{num:.2f}".format(num=1)
'1.00'
常用的格式化表达式如下:
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1.00 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
10 | {:x<4d} | 10xx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
11 | | | 进制 |