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.97

f-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 版本,因此可读性通常是首选它们更重要的原因。