f-strings(格式化字符串字面量)是 Python 中格式化字符串最简洁、易读的方式。它们于 Python 3.6 引入,通过在字符串前添加 f 或 F 前缀,允许您直接在字符串内嵌入变量和表达式。
本指南介绍如何在 Python 中使用 f-strings,包括表达式、格式说明符、数字格式化、对齐以及 Python 3.8 引入的调试简写。
基本语法
f-string 是一个带有 f 前缀的字符串字面量。花括号 {} 内的任何表达式都会在运行时求值,并将其结果插入到字符串中:
name = "Leia"
age = 30
print(f"My name is {name} and I am {age} years old.")My name is Leia and I am 30 years old.花括号内可以是任何有效的 Python 表达式——变量、属性访问、方法调用或算术运算:
price = 49.99
quantity = 3
print(f"Total: {price * quantity}")Total: 149.97f-strings 中的表达式
您可以在花括号内直接调用方法和函数:
name = "alice"
print(f"Hello, {name.upper()}!")Hello, ALICE!三元表达式也适用:
age = 20
print(f"Status: {'adult' if age >= 18 else 'minor'}")Status: adult您还可以访问字典键和列表项:
user = {"name": "Bob", "city": "Berlin"}
print(f"{user['name']} lives in {user['city']}.")Bob lives in Berlin.转义花括号
要在 f-string 中包含字面量花括号,请将其加倍:
value = 42
print(f"{{value}} = {value}"){value} = 42多行 f-Strings
要构建多行 f-string,请将其包裹在三引号中:
name = "Leia"
age = 30
message = f"""
Name: {name}
Age: {age}
"""
print(message)Name: Leia
Age: 30或者,使用隐式字符串连接来保持每行简短:
message = (f"Name: {name}\n"
f"Age: {age}")格式说明符
f-strings 支持 Python 的格式说明微型语言。完整语法如下:
{value:[fill][align][sign][width][grouping][.precision][type]}浮点数与精度
使用 :.Nf 控制小数位数:
pi = 3.14159265
print(f"{pi:.2f}")
print(f"{pi:.4f}")3.14
3.1416千位分隔符
使用 , 添加千位分隔符:
population = 1_234_567
print(f"{population:,}")1,234,567百分比
使用 :.N% 将值格式化为百分比:
score = 0.875
print(f"Score: {score:.1%}")Score: 87.5%科学计数法
使用 :e 表示科学计数法:
distance = 149_600_000
print(f"{distance:e}")1.496000e+08对齐与填充
使用 <、> 和 ^ 在固定宽度内对齐文本。可选地在对齐符号前指定填充字符:
print(f"{'left':<10}|")
print(f"{'right':>10}|")
print(f"{'center':^10}|")
print(f"{'padded':*^10}|")left |
right|
center |
**padded**|数字进制
使用 b、o、x 和 X 类型代码将整数转换为二进制、八进制或十六进制:
n = 255
print(f"Binary: {n:b}")
print(f"Octal: {n:o}")
print(f"Hex (lower): {n:x}")
print(f"Hex (upper): {n:X}")Binary: 11111111
Octal: 377
Hex (lower): ff
Hex (upper): FF使用 = 进行调试
Python 3.8 引入了 = 简写,它会打印表达式及其值。这对于快速调试非常有用:
x = 42
items = [1, 2, 3]
print(f"{x=}")
print(f"{len(items)=}")x=42
len(items)=3= 简写保留了确切的表达式文本,使其比普通的 print() 更具信息量。
快速参考
| 语法 | 描述 |
|---|---|
f"{var}" | 插入变量 |
f"{expr}" | 插入任何表达式 |
f"{val:.2f}" | 保留两位小数的浮点数 |
f"{val:,}" | 带千位分隔符的整数 |
f"{val:.1%}" | 保留一位小数的百分比 |
f"{val:e}" | 科学计数法 |
f"{val:<10}" | 在 10 个字符内左对齐 |
f"{val:>10}" | 在 10 个字符内右对齐 |
f"{val:^10}" | 在 10 个字符内居中 |
f"{val:*^10}" | 使用 * 填充居中 |
f"{val:b}" | 二进制 |
f"{val:x}" | 十六进制(小写) |
f"{val=}" | 调试:打印表达式和值 (3.8+) |
常见问题
f-strings 需要哪个 Python 版本?
f-strings 于 Python 3.6 引入。如果您使用的是 Python 3.5 或更早版本,请使用 str.format() 或 % 格式化。
f-strings 与 str.format() 有什么区别?
f-strings 在运行时求值并内联嵌入表达式。str.format() 使用位置或关键字占位符,且略显冗长。f-strings 通常更快,对于简单的格式化也更易读。
我可以在 f-string 表达式中使用引号吗?
可以,但必须使用与包裹 f-string 的引号类型不同的引号。例如,如果 f-string 使用双引号,请在花括号内使用单引号:f"Hello, {user['name']}"。在 Python 3.12 及更高版本中,可以在花括号内重用相同的引号类型。
我可以使用 f-strings 处理多行表达式吗?{} 内的表达式不能直接包含反斜杠,但您可以先在变量中预计算值,然后在 f-string 中引用该变量。
f-strings 比 % 格式化更快吗?
在许多常见情况下,f-strings 比 % 格式化和 str.format() 更快,同时也更易读。具体性能取决于表达式和 Python 版本,因此可读性通常是首选它们更重要的原因。