【Python基础知识库】Python中字符串格式化

字符串格式化

  • %格式化: 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
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值