Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式

Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式

你已经会用 f"{name}" 拼字符串了,但一到「金额保留两位小数」「日志里对齐成表格」「打印百分比」这些场景,还是习惯性地翻文档、拼 str.format,甚至 round() 加 str() 一顿手动拼接。其实这些 f-string 一个冒号就能搞定。

这篇把 f-string 里最实用的格式化语法过一遍,都是写业务代码天天要用的,记住就能少写一大堆胶水代码。

先看痛点:手动格式化有多啰嗦

python 复制代码
price = 1234.5
# 朴素写法:又是 round 又是补零,还容易漏
s = str(round(price, 2))  # '1234.5',小数位没补齐成两位!
print("¥" + s)           # ¥1234.5,不是你想要的 ¥1234.50

round 只做数值四舍五入,不负责「显示成两位小数」。要稳定显示两位小数,该用 f-string 的格式说明符。

数字格式化:冒号后面就是格式

f-string 里 {值:格式},冒号后面是「格式说明符」(和 format() 同一套语法):

python 复制代码
price = 1234.5
print(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 组合成 ,.2f
  • 08d 整数补零到 8 位(订单号、编号常用)

对齐与填充:打印成整齐的表格

日志里想让字段对齐成表格,用 <(左对齐)、>(右对齐)、^(居中),数字是宽度:

python 复制代码
rows = [("apple", 3), ("banana", 12), ("kiwi", 120)]
for name, qty in rows:
    # name 左对齐占 10 格,qty 右对齐占 5 格
    print(f"{name:<10}{qty:>5}")
# apple         3
# banana       12
# kiwi        120  ------ 数字右对齐,个位数天然对齐

还能指定填充字符(放在对齐符号前面):

python 复制代码
print(f"{'标题':*^20}")   # *******标题*********  ------ 用 * 填充并居中
print(f"{7:0>4}")         # 0007                ------ 用 0 填充右对齐(等价 04d)

宽度还能用变量,嵌套一层大括号动态传:

python 复制代码
width = 12
print(f"{'name':<{width}}")  # 宽度由 width 变量决定

调试神器:= 号自动打印「变量名=值」

Python 3.8 起,f-string 里在表达式后加 =,会同时打印表达式本身和它的值 ,调试时不用再写 print("x =", x) 了:

python 复制代码
x, y = 3, 4
print(f"{x=}, {y=}")        # x=3, y=4
print(f"{x + y=}")          # x + y=7  ------ 表达式原样 + 结果
print(f"{x * y = }")        # x * y = 12  ------ 等号旁留空格,输出也带空格

= 还能和格式说明符组合,调试浮点数特别顺手:

python 复制代码
import math
r = 2.5
print(f"{math.pi * r ** 2=:.2f}")  # math.pi * r ** 2=19.63

这是我个人最爱用的一招:临时排查时把 print(x) 改成 print(f"{x=}"),连变量名都帮你标好,删的时候也好找。

嵌套表达式与调用:大括号里能写几乎任意表达式

f-string 的大括号里可以放函数调用、下标、三元表达式、方法链:

python 复制代码
user = {"name": "alice", "score": 87}
print(f"{user['name'].upper()}")               # ALICE
print(f"{'及格' if user['score'] >= 60 else '不及格'}")  # 及格
print(f"{user.get('age', '未知')}")            # 未知  ------ 带默认值

注意引号嵌套:Python 3.12 之前,f-string 里不能用和外层相同的引号。3.12 起放宽了,但为了兼容老版本,内层习惯用另一种引号(外层双引号、内层单引号)。

一个常见坑:想输出真正的大括号要写两个

f-string 里 { 有特殊含义,想输出字面的大括号(比如生成 JSON 片段、CSS)要写 {``{ 和 }}:

python 复制代码
name = "box"
print(f"{{'class': '{name}'}}")  # {'class': 'box'}  ------ 外层 {{ }} 转义成字面括号

漏写会直接 SyntaxError 或把内容当表达式,生成模板字符串时尤其容易踩。

小结

  • 金额/小数用 :.2f(比 round 稳,不丢尾零),百分比 :.1%,千分位 :,,可组合成 :,.2f。
  • 对齐用 </>/^ + 宽度,填充字符放对齐符前面;宽度可用 {变量} 动态传。
  • 调试用 f"{x=}" 自动打印「变量名=值」,还能接 :.2f 等格式,比手写 print("x=", x) 省事。
  • 大括号里能写函数调用、下标、三元表达式;引号嵌套注意版本,输出字面大括号要写 {``{ }}。
  • 一句话记忆点:格式化的活别再手动 round+拼接了,一个冒号交给 f-string;排查 bug 一个 = 号搞定。
相关推荐
时早玖沐5 小时前
KOOK「找不到语音频道」:同一个错误假设,我犯了三次
python·开源·ai编程
_冷眸_5 小时前
Python 调用大模型 API:最小请求、Base URL 和 401/404 排查
开发语言·人工智能·python
niucloud-admin5 小时前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
standxy5 小时前
即时库存同步实战:从旺店通拉取库存详情落库 MySQL 的完整策略
数据库·集成·电商
麦壳饼5 小时前
SonnetDB:工业 IoT 中的 PID 历史分析与 PLC 协作
数据库·sonnetdb
吹什么轩5 小时前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
Dumbness5 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
甜到心里的蛋糕5 小时前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
张驰咨询公司5 小时前
六西格玛Python DOE试验矩阵:3因子2水平生成与验算
python·六西格玛·实验设计·itertools·doe试验矩阵
熊猫钓鱼>_>5 小时前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc