字符串格式化
- %格式化: C 语言风格的 sprintf 形式, 用%占位
# %o 八进制输出
print("八进制:%o" % 222)
# %d 十进制整数输出
print("整数:%d, %d, %d" % (1, 22.33, 0.25))
# %x 十六进制输出
print("十六进制:%x" % 12)
# 浮点数保留两位小数
print("浮点数保留两位小数:%.2f" % 3.1415926)
# 万能格式 %r,把任何类型(str、int、float、list、tuple、set、dict)数据转化为字符串类型
print("%r, %r, %r, %r, %r, %r, %r" % ("abc", 25, 3.1415926, [1, 2, 3], (1, 2, 3), {1, 2, 3}, {'a': 1, 'b': 2, 'c': 3}))
# %s 控制输出字符串的长度
print("%.3s" % ("abcdefg"))
print("%.*s" % (4, "abcdefg"))
# 结果
'''
八进制:336
整数:1, 22, 0
十六进制:c
浮点数保留两位小数:3.14
'abc', 25, 3.1415926, [1, 2, 3], (1, 2, 3), {1, 2, 3}, {'a': 1, 'b': 2, 'c': 3}
abc
abcd
'''
# 无法同时传递一个变量和元组
'This is %s' % name
# 当name=(1, 2, 3)时
'This is %s' % (name,) # 提供一个单元素的元组,而不是一个参数,逗号必须加
- str.format()格式化:函数把字符串单层一个模版,通过传入的参数进行格式化,用{}占位
# 匹配位置{}
print('This is {}{}'.format("Python", "!"))
# 匹配位置带编号{i},i从0按位置递增,位置可以多次使用
print('This is {0}{1} {0} is esay{1}'.format("Python", "!"))
# 关键字传参
print('This is {name}{symbol}'.format(name="Python", symbol="!"))
# 字典传参
print('This is {name}{symbol}'.format(**{"name": "Python", "symbol": "!"}))
# 整数格式化
print("整数:{:d}".format(123))
# 浮点数格式化
print("浮点数保留两位小数:{:.2f}".format(3.1415926))
# 字符串格式化
print("字符串:{:s}".format("abcdefg"))
# 八进制格式化
print("八进制:{:o}".format(222))
# 十六进制格式化
print("十六进制:{:x}".format(12))
# 结合编号的数值格式化
print("编号组合数值格式化:{0:d}, {1:s}".format(123, "abcdefg"))
# 关键字结合数值格式化
print("关键字结合数值格式化:{num:d}, {string:s}".format(num = 123, string = "abcdefg"))
# 百分数精度
print("百分数:{:.2%}".format(3/7))
# 金钱的千分隔符
print("金钱分隔符:{:,}".format(123456789))
# 输出大括号
print("输出大括号:{}为{{1, 2, 3}}".format("集合"))
# 结果
'''
This is Python!
This is Python! Python is esay!
This is Python!
This is Python!
整数:123
浮点数保留两位小数:3.14
字符串:abcdefg
八进制:336
十六进制:c
编号组合数值格式化:123, abcdefg
关键字结合数值格式化:123, abcdefg
百分数:42.86%
金钱分隔符:123,456,789
输出大括号:集合为{1, 2, 3}
'''
- f-string格式化:Python 3.6 新加入的方法,风格简洁、易读、速度快
# 字符串格式化
name, age = "lucy", 20
print(f"she is {name}, {age} years old.")
# 字典格式化
info = {'name': "lucy", 'age': 20}
print(f"she is {info['name']}, {info['age']} years old.")
# 浮点数精度限制
print(f"she is {name}, {age: .2f} years old.")
# 指定宽度,为了多行输出时整齐(:< 8左对齐,:> 8右对齐)
print(f"she is {name:<10}, {age:<3} years old.")
name1, age1 = "Liming", 3
print(f"she is {name1:<10}, {age1:<3} years old.")
name2, age2 = "Lee", 101
print(f"she is {name2:<10}, {age2:<3} years old.")
# 整数格式化
print(f"整数:{123:d}")
# 浮点数格式化
print(f"浮点数保留两位小数:{3.1415926:.2f}")
# 字符串格式化
print(f"字符串:{'abcdefg':s}")
# 八进制格式化
print(f"八进制:{222:o}")
# 十六进制格式化
print(f"十六进制:{12:x}")
# 百分数精度
print(f"百分数:{(3/7):.2%}")
# 金钱的千分隔符
print(f"金钱分隔符:{123456789:,}")
# 结果
'''
she is lucy, 20 years old.
she is lucy, 20 years old.
she is lucy, 20.00 years old.
she is lucy , 20 years old.
she is Liming , 3 years old.
she is Lee , 101 years old.
整数:123
浮点数保留两位小数:3.14
字符串:abcdefg
八进制:336
十六进制:c
百分数:42.86%
金钱分隔符:123,456,789
'''
相对于%,format()的优点:
- (1).在%方法中%s只能替代字符串类型,而.format()方法不用考虑数据类型问题;
- (2).单个参数可以多次输出,参数顺序可以不相同;
- (3).填充方式十分灵活,对齐方式十分强大;
- (4).可以使用列表、元组格式化,可以使用字典格式化(传入用**解构);
# 几种格式化方法性能比较,性能最好的是f-string
import timeit
def add():
status = 200
body = 'hello world'
return 'Status: ' + str(status) + '\r\n' + body + '\r\n'
# % 格式化
def precent_style():
status = 200
body = 'hello world'
return 'Status: %s\r\n%s\r\n' % (status, body)
# str.format()
def format_style1():
status = 200
body = 'hello world'
return 'Status: {}\r\n{}\r\n'.format(status, body)
# str.format(**dict)字典形式传参
def format_style2():
status = 200
body = 'hello world'
return 'Status: {status}\r\n{body}\r\n'.format(status=status, body=body)
# f-string格式
def f_string():
status = 200
body = 'hello world'
return f'Status: {status}\r\n{body}\r\n'
# 计算时间
print('add: '+ str(min(timeit.repeat(lambda: add()))))
print('precent_style: '+ str(min(timeit.repeat(lambda: precent_style()))))
print('format_style1: '+ str(min(timeit.repeat(lambda: format_style1()))))
print('format_style2: '+ str(min(timeit.repeat(lambda: format_style2()))))
print('f_string: '+ str(min(timeit.repeat(lambda: f_string()))))
# 结果
'''
add: 1.0201557999999995
precent_style: 0.7589769999999998
format_style1: 1.2661715999999998
format_style2: 1.2782307000000017
f_string: 0.5236783999999979
'''