f-string 把值放进花括号,格式写在冒号后面。先看下面这一屏答案,够用就走。想再往下听,还有日期、动态宽度,以及在 Python 3.11 上照样会把代码搞崩的引号写法。
🎙️ 发布并录制于: ·
每个例子都按三段读:值、冒号、格式说明。一个点、数字二、字母 f,就是保留两位小数。一个逗号,就是加千位分隔符。百分号格式会把比例乘以一百,再补上百分号。对齐是一个方向符号加上字段宽度。
name, price, big, ratio = "Ada", 49.9, 1234567, 0.8756
f"{name}" # Ada basic
f"{price:.2f}" # 49.90 2 decimals ← most googled
f"{big:,}" # 1,234,567 thousands separator
f"{ratio:.1%}" # 87.6% percentage
f"{price:>10.2f}" # " 49.90" right-align, width 10
f"{name:<10}|" # "Ada |" left-align (tables!)
f"{name:^10}" # " Ada " centered
f"{42:05d}" # 00042 zero-padded
f"{255:x}" f"{255:b}" # ff / 11111111 hex, binary
f"{2+3}" # 5 any expression works
f"{price=}" # price=49.9 debug print (3.8+)
f"{{literal}}" # {literal} escaped braces
等号那种写法值得专门记住,调试时它会把表达式和值一起打印出来。要在最终文本里输出花括号本身,就写两个;单个花括号属于 f-string 的解析器。
datetime 对象可以在冒号后面直接写日期格式码。年、月、日拼出 ISO 风格的日期;大写 H 加大写 M 是二十四小时制的时间。如果宽度或者精度来自配置,就把那个变量再套一层花括号,放进格式说明里面。
from datetime import datetime
now = datetime.now()
f"{now:%Y-%m-%d}" # 2026-07-25
f"{now:%H:%M}" # 14:30
f"{now:%b %d, %Y}" # Jul 25, 2026
f"{now:%A}" # Saturday
width, prec = 12, 3
f"{price:{width}.{prec}f}" # " 49.900"
动态格式说明看上去很挤,所以宽度和精度的变量名一定要起清楚。格式是固定的,就把数字直接写死。只有当调用方或者配置真的会改这两个值,这一层间接才划得来。
在 Python 3.11 及更早的版本上,外层 f-string 和字典的键都用双引号,会得到真实报错 SyntaxError: f-string: unmatched left bracket。解析器认为里面那个引号已经把字符串结束掉了。外层保持双引号,把键的引号改成单引号就行。Python 3.12 放宽了这条规则,但混用引号在各版本上都能跑。
d = {"key": "value"}
f"{d["key"]}"
# SyntaxError: f-string: unmatched '['
f"{d['key']}" # value — works on Python 3.6+
python --version。如果是 3.11 或更早,就照上面的样子把内外引号错开。要是还报错,回头看上一行有没有没闭合的引号或花括号;Python 指的位置往往是解析彻底走不下去的地方,不是你打错字的那一行。百分号格式化和 dot format 会读就够了,那是维护老代码用的;新写的业务代码一律用 f-string。日志是有意留下的例外:logger 调用保留百分号占位符,这样在这个日志级别没开的时候,它可以先不拼接这条消息。
logger.info("price=%s", price) # keep this logging style
# Old code: "%0.2f" % price, or "{:.2f}".format(price)