Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
你已经会用f"{name}"拼字符串了,但一到「金额保留两位小数」「日志里对齐成表格」「打印百分比」这些场景,还是习惯性地翻文档、拼str.format,甚至round()加str()一顿手动拼接。其实这些 f-string 一个冒号就能搞定。
这篇把 f-string 里最实用的格式化语法过一遍,都是写业务代码天天要用的,记住就能少写一大堆胶水代码。
先看痛点:手动格式化有多啰嗦
price=1234.5# 朴素写法:又是 round 又是补零,还容易漏s=str(round(price,2))# '1234.5',小数位没补齐成两位!print("¥"+s)# ¥1234.5,不是你想要的 ¥1234.50round只做数值四舍五入,不负责「显示成两位小数」。要稳定显示两位小数,该用 f-string 的格式说明符。
数字格式化:冒号后面就是格式
f-string 里{值:格式},冒号后面是「格式说明符」(和format()同一套语法):
price=1234.5print(f"¥{price:.2f}")# ¥1234.50 —— .2f 固定两位小数print(f"{0.1234:.1%}")# 12.3% —— 百分比,自动 ×100 加 %print(f"{1234567:,}")# 1,234,567 —— 千分位分隔符print(f"{1234567:,.2f}")# 1,234,567.00 —— 千分位 + 两位小数print(f"{255:#x}")# 0xff —— 十六进制,# 加前缀print(f"{42:08d}")# 00000042 —— 补零到 8 位(常用于流水号)几个高频记忆点:
.2f定点两位小数(金额首选,不会像 round 那样丢尾零).1%百分比,值会自动乘 100 再加%,千分位;可和.2f组合成,.2f08d整数补零到 8 位(订单号、编号常用)
对齐与填充:打印成整齐的表格
日志里想让字段对齐成表格,用<(左对齐)、>(右对齐)、^(居中),数字是宽度:
rows=[("apple",3),("banana",12),("kiwi",120)]forname,qtyinrows:# name 左对齐占 10 格,qty 右对齐占 5 格print(f"{name:<10}{qty:>5}")# apple 3# banana 12# kiwi 120 —— 数字右对齐,个位数天然对齐还能指定填充字符(放在对齐符号前面):
print(f"{'标题':*^20}")# *******标题********* —— 用 * 填充并居中print(f"{7:0>4}")# 0007 —— 用 0 填充右对齐(等价 04d)宽度还能用变量,嵌套一层大括号动态传:
width=12print(f"{'name':<{width}}")# 宽度由 width 变量决定调试神器:=号自动打印「变量名=值」
Python 3.8 起,f-string 里在表达式后加=,会同时打印表达式本身和它的值,调试时不用再写print("x =", x)了:
x,y=3,4print(f"{x=},{y=}")# x=3, y=4print(f"{x+y=}")# x + y=7 —— 表达式原样 + 结果print(f"{x*y=}")# x * y = 12 —— 等号旁留空格,输出也带空格=还能和格式说明符组合,调试浮点数特别顺手:
importmath r=2.5print(f"{math.pi*r**2=:.2f}")# math.pi * r ** 2=19.63这是我个人最爱用的一招:临时排查时把print(x)改成print(f"{x=}"),连变量名都帮你标好,删的时候也好找。
嵌套表达式与调用:大括号里能写几乎任意表达式
f-string 的大括号里可以放函数调用、下标、三元表达式、方法链:
user={"name":"alice","score":87}print(f"{user['name'].upper()}")# ALICEprint(f"{'及格'ifuser['score']>=60else'不及格'}")# 及格print(f"{user.get('age','未知')}")# 未知 —— 带默认值注意引号嵌套:Python 3.12 之前,f-string 里不能用和外层相同的引号。3.12 起放宽了,但为了兼容老版本,内层习惯用另一种引号(外层双引号、内层单引号)。
一个常见坑:想输出真正的大括号要写两个
f-string 里{有特殊含义,想输出字面的大括号(比如生成 JSON 片段、CSS)要写{{和}}:
name="box"print(f"{{'class': '{name}'}}")# {'class': 'box'} —— 外层 {{ }} 转义成字面括号漏写会直接SyntaxError或把内容当表达式,生成模板字符串时尤其容易踩。
小结
- 金额/小数用
:.2f(比round稳,不丢尾零),百分比:.1%,千分位:,,可组合成:,.2f。 - 对齐用
</>/^+ 宽度,填充字符放对齐符前面;宽度可用{变量}动态传。 - 调试用
f"{x=}"自动打印「变量名=值」,还能接:.2f等格式,比手写print("x=", x)省事。 - 大括号里能写函数调用、下标、三元表达式;引号嵌套注意版本,输出字面大括号要写
{{ }}。 - 一句话记忆点:格式化的活别再手动 round+拼接了,一个冒号交给 f-string;排查 bug 一个
=号搞定。