Python f-string妙用:90%的人只用了1%的功能
目录
在数据展示、报表生成、科学计算等场景中,我们经常需要控制浮点数的显示精度。Python 3.6 引入的 f-string(格式化字符串字面量)提供了一种简洁、高效的方式。本文将详细介绍如何使用 f-string 保留小数点位数,以及更多格式化技巧。
一、f-string 基础
f-string 是在字符串前加上 f 或 F 前缀,并在花括号 {} 中嵌入变量或表达式,同时支持格式说明符。
python
name = "Alice"
score = 95.5
print(f"{name} 的分数是 {score}") # Alice 的分数是 95.5
如果需要控制小数位数,可以在表达式后添加格式说明符 : 和格式规则。
二、保留小数点后指定位数
2.1 基本用法
:.nf
最常用的格式是 :.nf,其中 n表示保留的小数位数,f表示固定小数点表示法。
python
pi = 3.1415926535
print(f"{pi:.2f}") # 3.14
print(f"{pi:.4f}") # 3.1416
如果实际小数位数不足,会用 0 补齐。
如果超出,会进行四舍五入。
python
value = 5
print(f"{value:.2f}") # 5.00
2.2 自动舍入与精度
:.nf 遵循银行家舍入法,但日常使用可视为四舍五入。
python
print(f"{2.675:.2f}") # 2.67(注意:由于浮点表示,实际可能为2.67)
print(f"{2.685:.2f}") # 2.69
如果需要更精确的控制,可使用 decimal 模块。
三、结合宽度与对齐
有时我们不仅需要控制小数位数,还需要指定总宽度和对齐方式,以便对齐输出。
3.1 指定最小宽度
格式为 :宽度.精度f。
python
numbers = [12.3, 456.789, 7.0]
for n in numbers:
print(f"{n:10.2f}") # 总宽度10,保留2位小数
#输出:
12.30
456.79
7.00
3.2 对齐方式
< 左对齐(默认数值右对齐,字符串左对齐)
> 右对齐
^ 居中对齐
python
print(f"{3.14159:<10.2f}") # 3.14 (左对齐)
print(f"{3.14159:>10.2f}") # 3.14(右对齐)
print(f"{3.14159:^10.2f}") # 3.14 (居中)
3.3 填充字符
可以指定填充字符(默认为空格),放在对齐符之前。
python
print(f"{3.14:0>10.2f}") # 0000003.14
print(f"{3.14:*^10.2f}") # ***3.14***
四、千位分隔符
对于大数字,添加千位分隔符能提高可读性。使用 , 或 _
python
amount = 1234567.89
print(f"{amount:,.2f}") # 1,234,567.89
print(f"{amount:_.2f}") # 1_234_567.89
可以结合宽度、对齐等使用。
五、显示正负号
默认负数带 -,正数不带符号。
使用 + 强制显示正号。
使用空格在正数前留一个空格,便于对齐。
python
positive = 3.14
negative = -2.71
print(f"{positive:+.2f}") # +3.14
print(f"{negative:+.2f}") # -2.71
print(f"{positive: .2f}") # 3.14(正数前留空格)
六、百分比格式
将小数转换为百分比显示,使用 % 格式符。它会自动将数值乘以100并添加 % 符号,并可指定小数位数。
python
ratio = 0.857
print(f"{ratio:.1%}") # 85.7%
print(f"{ratio:.2%}") # 85.70%
七、科学计数法
使用 e 或 E 显示科学计数法。
python
num = 0.00012345
print(f"{num:.2e}") # 1.23e-04
print(f"{num:.2E}") # 1.23E-04
同样可以指定宽度、对齐等。
八、保留小数点但截断不四舍五入?
f-string 的 :.nf 是四舍五入的。如果需要直接截断(不进行四舍五入),可以借助 math.floor 或字符串操作,但更推荐使用decimal模块。
python
import math
value = 3.14159
truncated = math.floor(value * 100) / 100 # 3.14
print(f"{truncated:.2f}") # 3.14
九、在表达式中使用
f-string 支持在花括号内执行表达式,因此可以直接在格式化时进行计算。
python
total = 100
count = 3
print(f"平均值: {total / count:.2f}") # 平均值: 33.33
也可以调用函数。
python
def format_currency(amount):
return f"${amount:,.2f}"
price = 1234.5
print(f"价格: {format_currency(price)}") # 价格: $1,234.50
十、与其他格式化方式的对比
%格式化:%.2f % pi , 旧式,可读性差,不推荐
str.format(): "{:.2f}".format(pi) ,功能强大,但稍显冗长
f-string :f"{pi:.2f}",最简洁,性能最好(Python 3.6+)
f-string 在可读性和性能上都优于前两者,是 Python 3.6 之后的首选。
十一、实战案例
11.1 商品价格表
python
products = [
("苹果", 5.99),
("香蕉", 3.50),
("橙子", 4.25)
]
print("商品 单价")
for name, price in products:
print(f"{name:<6}¥{price:>7.2f}")
# 输出:
商品 单价
苹果 ¥ 5.99
香蕉 ¥ 3.50
橙子 ¥ 4.25
11.2 科学数据展示
python
values = [0.001234, 12345.6789, -0.0000567]
for v in values:
print(f"{v:>12.4e} 原始值: {v}")
11.3 百分比进度
python
completed = 123
total = 500
percent = completed / total
print(f"进度: {percent:.1%} ({completed}/{total})")
# 进度: 24.6% (123/500)
十二、注意事项
1. 性能:f-string 在编译时被转换为高效的 FORMAT_VALUE操作码,比format() 和%更快。
2. 兼容性:仅支持 Python 3.6+,若需兼容旧版本,使用 str.format()。
3. 浮点精度:浮点数本身存在精度问题,格式化只是显示层面的处理。需要精确计算时,应使用 decimal.。
4. 表达式复杂度:虽然支持表达式,但保持简洁更利于阅读。
十三、总结
保留2位小数: f"{num:.2f}"
宽度10,右对齐,保留2位: f"{num:>10.2f}"
千位分隔符:f"{num:,.2f}"
百分比: f"{ratio:.1%}"
科学计数法: f"{num:.2e}"
显示正号: f"{num:+.2f}"
f-string 是 Python 中最优雅、最高效的字符串格式化方式。掌握它,能让你的代码更简洁,输出更美观。希望本文能帮助你在实际开发中灵活运用 f-string 处理小数格式化。
如果觉得有收获,欢迎点赞、收藏、关注哦。
更多推荐



所有评论(0)