字符串格式化的三种形式
1、%-formatting
在 Python2.6之前,字符串迭代只有一种方法,就是 % 操作符,效果和 C语言中的 % 类似
print("my name is %s , age is %d" % ("Jack", 15))
# my name is Jack , age is 15
以下python字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
2、str.format()
到 Python2.6时,出现了一种新的字符串格式化方法,str.format()函数,format函数 使用 {} 和 : 代替了 % ,使用起来更加方便。
# 不指定参数位置 'hello world'
'{} {}'.format("hello","world")
# 指定参数位置 'hello world'
'{0} {1}'.format("hello","world")
# 参数可以使用多次 'world:hello world'
'{1}:{0} {1}'.format("hello","world")
# 使用关键字参数 'tom27'
'{name}{age}'.format(name='tom', age=27)
# 通过下标映射 'hello world'
'{0[0]} {0[1]}'.format(["hello", "world"]) # "0" 是必须的
# 通过key映射 'tom 18'
'{0[name]} {0[age]}'.format({"name":"tom", "age":18})
# 按对象属性映射 'tom 27'
'{person.name} {person.age}'.format(person=person)
# 字典解包 'tom 18'
'{name} {age}'.format(**{"name":"tom", "age":18})
# 列表解包 'hello world'
'{0} {1}'.format(*["hello", "world"])
数字格式化
print("{:.2f}".format(3.1415926)) # 3.14
下表展示了 str.format() 格式化数字的多种方法:
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
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) |
3、f-string
Formatted String Literals(字面量格式化字符串),简称f-string
f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。
f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:
name = "tom"
age = 18
print(f"{name} & {age}")
# tom & 18
w = {'name': 'baidu', 'url': 'www.baidu.com'}
print(f'{w["name"]}: {w["url"]}')
# baidu: www.baidu.com
用了这种方式明显更简单了,不用再去判断使用 %s,还是 %d。