format OR %
提到Python中的格式化输出方法,一般来说有以下两种方式:
print('hello %s' % 'world')# hello worldprint('hello {}'.format('world'))# hello world
format()
不用理会数据类型,%s
,%f
等等我记不完;format()
功能更丰富,填充方式,对齐方式都很灵活,让你的打印效果更美观;format()
是官方推荐的,%
指不定就在未来版本中给废弃掉了。
基本用法
print('{} {}'.format('hello', 'world')) # 最基本的print('{0} {1}'.format('hello', 'world')) # 通过位置参数print('{0} {1} {0}'.format('hello', 'world')) # 单个参数多次输出"""输出结果hello worldhello worldhello world hello"""
关键词定位
# 通过关键词参数print('我的名字是{name},我今年{age}岁了。'.format(name='小明', age='12'))# 与位置参数一样,单个参数也能多次输出print('{name}说:"我的名字是{name},我今年{age}岁了。"'.format(name='小明', age='12'))"""输出结果我的名字是小明,我今年12岁了。小明说:"我的名字是小明,我今年12岁了。""""
可变参数
既然format()
是一个方法,那是不是也接受*args
和**kwargs
形式的传参呢,答案是肯定的。
# 传入listdata = ['hello', 'world']print('{0} {1}'.format(*data))# 传入dictdata = {'name': '小明', 'age': 12}print('我的名字是{name},我今年{age}岁了。'.format(**data))# 混用data_1 = ['hello', 'world']data_2 = {'name': '小明', 'age': 12}print('{0} {1} 我的名字是{name},我今年{age}岁了,{0}!'.format(*data_1, **data_2))"""输出结果hello world我的名字是小明,我今年12岁了。hello world 我的名字是小明,我今年12岁了,hello!"""
固定宽度
format()
可以指定输出宽度为多少,当字符串长度少于设定值的时候,默认用空格填充:
data = [{'name': 'Mary', 'college': 'Tsinghua University'}, {'name': 'Micheal', 'college': 'Harvard University'}, {'name': 'James', 'college': 'Massachusetts Institute of Technology'}]data = [{'name': 'Mary', 'college': 'Tsinghua University'}, {'name': 'Micheal', 'college': 'Harvard University'}, {'name': 'James', 'college': 'Massachusetts Institute of Technology'}]# 固定宽度输出for item in data: print('{:10}{:40}'.format(item['name'], item['college']))"""输出结果Mary Tsinghua University Micheal Harvard University James Massachusetts Institute of Technology """
当然除了空格,我们也可以选择其他字符来填充,譬如我想打印一条分割线,便可以选择通过-
来填充:
# 固定宽度输出for item in data: # 每输出一条记录之前打印一条分割线 # 选择用其他字符来填充时需要指定对齐方式 print('{:-^60}'.format('我是分割线')) print('{:10}{:40}'.format(item['name'], item['college']))"""输出结果---------------------------我是分割线----------------------------Mary Tsinghua University ---------------------------我是分割线----------------------------Micheal Harvard University ---------------------------我是分割线----------------------------James Massachusetts Institute of Technology """
对齐方式
format()
支持左对齐,右对齐,居中,分别对应<
,>
,^
,具体怎么使用我们看实例:
data = [{'name': 'Mary', 'college': 'Tsinghua University'}, {'name': 'Micheal', 'college': 'Harvard University'}, {'name': 'James', 'college': 'Massachusetts Institute of Technology'}]print('{:-^50}'.format('居中'))for item in data: print('{:^10}{:^40}'.format(item['name'], item['college']))print('{:-^50}'.format('左对齐'))for item in data: print('{:<10}{:<40}'.format(item['name'], item['college']))print('{:-^50}'.format('右对齐'))for item in data: print('{:>10}{:>40}'.format(item['name'], item['college']))"""输出结果------------------------居中------------------------ Mary Tsinghua University Micheal Harvard University James Massachusetts Institute of Technology -----------------------左对齐------------------------Mary Tsinghua University Micheal Harvard University James Massachusetts Institute of Technology -----------------------右对齐------------------------ Mary Tsinghua University Micheal Harvard University James Massachusetts Institute of Technology"""
数字格式化
常用的示例如下:
# 取小数点后两位num = 3.1415926print('小数点后两位:{:.2f}'.format(num))# 带+/-输出num = -3.1415926print('带正/负符号:{:+.2f}'.format(num))# 转为百分比num = 0.34534print('百分比:{:.2%}'.format(num))# 科学计数法num = 12305800000print('科学计数法:{:.2e}'.format(num))# ,分隔num = 12305800000print('","分隔:{:,}'.format(num))# 转为二进制num = 15print('二进制:{:b}'.format(num))# 十六进制num = 15print('十六进制:{:x}'.format(num))# 八进制num = 15print('八进制:{:o}'.format(num))"""输出结果小数点后两位:3.14带正/负符号:-3.14百分比:34.53%科学计数法:1.23e+10,分隔:12,305,800,000二进制:1111十六进制:f八进制:17"""
输出花括号
当然,如果我们想输出的{}
的时候怎么办呢?
# 输出花括号print('我是{{{}}}'.format('Awesome_Tang'))"""输出结果我是{Awesome_Tang}"""
花式玩法
其实结合以上这些特性,我们可以来点好玩点,譬如说自己写一个进度条:
import timelength = 1000for i in range(1, length + 1): percent = i / length bar = '▉' * int(i // (length / 50)) time.sleep(0.01) print('\r进度条:|{:<50}|{:>7.1%}'.format(bar, percent), end='')print('\n')
- 效果如下:
现在你觉得%
和str.format()
哪个更好用呢?