精通 Python f-string:一篇完整的格式化指南
自 Python 3.6 引入以来,f-string(格式化字符串字面量)已成为 Python 中最受欢迎、最直观的字符串格式化方式。它不仅可读性强,而且执行效率高。
本文将从基础用法开始,深入到初学者经常关心的数字格式化 (.2f, %)、对齐 (<, ^,>),以及更多高级技巧,帮助读者全面掌握 f-string。
1. 基础用法:{}
f-string 的基础是在一个字符串前加上 f 或 F,然后在字符串中用花括号 {} 包裹变量或表达式。
name = "Alice"
age = 30
# 1. 插入变量
print(f"你好, {name}!")
# 2. 执行表达式
print(f"{name} 明年就 {age + 1} 岁了。")
# 3. 调用函数或方法
print(f"你的名字大写是: {name.upper()}")
# 4. 访问字典或列表
user = {'name': 'Bob', 'id': 123}
print(f"用户: {user['name']} (ID: {user['id']})")
输出:
你好, Alice!
Alice 明年就 31 岁了。
你的名字大写是: ALICE
用户: Bob (ID: 123)
2. 核心:格式化迷你语言 (The Mini-Language)
f-string 真正的威力来自于花括号内的“格式化说明符”。它使用冒号 (:) 来激活。
基本语法:{value:format_spec}
format_spec (格式说明符) 的内容非常丰富,来分解读者一般最关心的几个部分。
3. 数字格式化 (你最关心的 .2f 和 %)
这是 f-string 最常用的功能之一,尤其是在处理数据和金融时。
(A) 浮点数 (小数) - :f
-
f代表 "Fixed-point" (定点数),即常规的小数形式。 -
.N用来指定小数点后的位数,并且会自动四舍五入。
{value:.Nf}
pi = 3.1415926
price = 12.345
cost = 50
# :.2f - 你问到的:保留两位小数 (会四舍五入)
print(f"Pi 约等于: {pi:.2f}") # 输出: 3.14
print(f"价格: {price:.2f}") # 输出: 12.35 (注意 .345 被四舍五入)
# 自动补零
print(f"费用: {cost:.2f}") # 输出: 50.00
(B) 百分比 - :%
-
%会自动将数字乘以 100,然后添加一个%号。 -
结合
.N,可以控制乘以 100 后的小数位数。
{value:.N%}
ratio = 0.75
growth_rate = 0.05234
# :.0% - 保留0位小数的百分比
print(f"进度: {ratio:.0%}") # 输出: 75%
# :.2% - 保留2位小数的百分比
print(f"增长率: {growth_rate:.2%}") # 输出: 5.23% (0.05234 * 100 = 5.234)
(C) 整数 - :d 和补零
-
:d代表 "Decimal" (十进制整数)。 -
:0N是一种常用技巧,表示总宽度为 N,不足的前面用 0 填充。
file_num = 42
total_width = 5
# :05d - 总共5位数,用0在左侧填充
print(f"文件名: file_{file_num:05d}.txt") # 输出: file_00042.txt
(D) 千位分隔符 - ,
-
,是一个非常方便的指令,用于自动添加千位分隔符。
large_number = 1234567890
large_float = 9876543.21
# :,d - 整数千位分隔
print(f"市值: ${large_number:,d}") # 输出: $1,234,567,890
# :,.2f - 浮点数千位分隔并保留2位小数
print(f"销量: {large_float:,.2f}") # 输出: 9,876,543.21
4. 对齐与填充 (你关心的 < 和 ^)
对齐用于控制值在给定的总宽度 (width) 内的显示位置。这在制作表格时极为有用。
通用语法::[fill][align][width]
-
[fill](可选): 填充字符,比如*,_,(空格是默认值)。 -
[align](可选): 对齐方式。-
:<: 左对齐 (Left) (默认) -
:^: 居中对齐 (Center) -
:>: 右对齐 (Right)
-
-
[width](必需): 希望的总字符宽度。
text = "Hello"
# :<10 - 左对齐,总宽10 (Hello后有5个空格)
print(f"'{text:<10}'")
# :>10 - 右对齐,总宽10 (Hello前有5个空格)
print(f"'{text:>10}'")
# :^10 - 居中对齐,总宽10 (前后各有2/3个空格)
print(f"'{text:^10}'")
# 结合 [fill] 填充字符
# :*^20 - 居中对齐,总宽20,用 '*' 填充
print(f"'{text:*^20}'")
输出:
'Hello '
' Hello'
' Hello '
'*******Hello********'
5. 终极组合:对齐、精度、类型全都要
f-string 最强大的地方在于可以将这些指令组合起来。
组合语法::[fill][align][width][,][.precision][type]
用一个制作表格的实际例子来展示组合的力量:
items = [
("Apple", 5, 0.75),
("Banana", 12, 0.3333),
("Cherry", 105, 0.055),
]
# 1. 打印表头
# 'Item' 左对齐, 宽10
# 'Qty' 居中, 宽5
# 'Price' 右对齐, 宽8
print(f"{'Item':<10} | {'Qty':^5} | {'Price':>8}")
print("-" * 27) # 打印分隔线
# 2. 循环打印内容
for item, qty, price in items:
# {item:<10} : 字符串, 左对齐, 宽10
# {qty:^5d} : 整数, 居中, 宽5
# {price:>8.2f}: 浮点数, 右对齐, 宽8, 保留2位小数
print(f"{item:<10} | {qty:^5d} | {price:>8.2f}")
输出 (一个完美对齐的表格):
Item | Qty | Price
---------------------------
Apple | 5 | 0.75
Banana | 12 | 0.33
Cherry | 105 | 0.06
(注意 0.3333 和 0.055 都被正确地四舍五入并对齐了)
6. 更多高级技巧
(A) 调试 (Python 3.8+)
这是一个超级有用的调试功能。在变量后加上 =,f-string 会同时打印变量名和它的值。
user = "Admin"
count = 10
print(f"{user=} {count=}")
# 输出: user='Admin' count=10
(B) 日期时间格式化
f-string 可以直接格式化 datetime 对象,使用与 time.strftime() 相同的格式代码。
from datetime import datetime
now = datetime.now()
print(f"现在时间: {now:%Y-%m-%d %H:%M:%S}")
# 输出: 现在时间: 2025-11-01 00:03:23 (根据当前时间)
(C) 转换标志:!s, !r, !a
在冒号 : 之前,还可以使用 ! 来强制转换类型。
-
!s: 调用str()(默认) -
!r: 调用repr()(显示带引号的字符串或调试信息) -
!a: 调用ascii()
my_string = "你好"
print(f"{my_string}") # 输出: 你好
print(f"{my_string!r}") # 输出: '你好'
print(f"{my_string!a}") # 输出: '\u4f60\u597d'
(D) 显示花括号
如果想在 f-string 中显示 { 或 } 怎么办?使用双层括号 {{ 和 }}。
print(f"f-string 使用 {{ 和 }} 来显示花括号")
# 输出: f-string 使用 { 和 } 来显示花括号
总结
f-string 已经成为 Python 中字符串格式化的黄金标准。通过组合使用宽度、对齐 (<, ^, >)、填充、精度 (.Nf) 和类型 (%, d, f),可以构建出任何你想要的格式化输出。
更多推荐
所有评论(0)