Python f-string 的格式化和调试功能

FreeGuideOnline 最新 2026-07-06

Python f-string 格式化和调试功能完全指南

什么是 f-string

f-string(格式化字符串字面量)是 Python 3.6 引入的一种字符串格式化方式。它以 fF 前缀开头,允许直接在字符串字面量中嵌入表达式,使代码更简洁、可读性更强。

相比传统的 % 格式化和 str.format(),f-string 提供了更直观的语法和更优的性能。

基本语法

在字符串前加上 f,并使用花括号 {} 包裹变量或表达式即可。

name = "Alice"
age = 30

print(f"{name} is {age} years old.")
# 输出:Alice is 30 years old.

花括号内可以是任意有效的 Python 表达式。

print(f"Next year, {name} will be {age + 1}.")
# 输出:Next year, Alice will be 31.

如果字符串中需要包含字面花括号,使用双花括号 {{}} 进行转义。

print(f"{{name}} will not be replaced.")
# 输出:{name} will not be replaced.

格式化输出

f-string 支持 format() 方法的几乎所有格式化迷你语言。格式说明符写在表达式之后,用冒号 : 分隔。

{expression:format_spec}

对齐与填充

可以指定宽度、对齐方式以及填充字符。

  • :< 左对齐
  • :> 右对齐
  • :^ 居中对齐
  • 填充字符写在宽度前
word = "Python"

print(f"{word:<10}")      # 'Python    '
print(f"{word:>10}")      # '    Python'
print(f"{word:^10}")      # '  Python  '
print(f"{word:*^10}")     # '**Python**'
print(f"{word:_>10}")     # '____Python' (注意填充字符位置)

默认情况下,数字右对齐,字符串左对齐。

数字格式化

控制小数位数、千分位分隔符、正负号显示等。

pi = 3.1415926
num = 1234567890

# 保留两位小数
print(f"{pi:.2f}")          # 3.14

# 千分位分隔符
print(f"{num:,}")           # 1,234,567,890

# 组合使用:宽度、对齐、千分位、小数
print(f"{num:>20,.2f}")     #        1,234,567,890.00

# 带符号显示
print(f"{pi:+.2f}")         # +3.14
print(f"{-pi:+.2f}")        # -3.14

# 正数前空格,负数前负号
print(f"{pi: .2f}")         # ' 3.14'
print(f"{-pi: .2f}")        # '-3.14'

进制与百分比

轻松实现进制转换和百分比显示。

value = 255
ratio = 0.875

# 二进制、八进制、十六进制
print(f"{value:b}")       # 11111111
print(f"{value:#b}")      # 0b11111111  (带前缀)
print(f"{value:o}")       # 377
print(f"{value:#o}")      # 0o377
print(f"{value:x}")       # ff
print(f"{value:#x}")      # 0xff
print(f"{value:X}")       # FF  (大写)

# 百分比
print(f"{ratio:%}")       # 87.500000%
print(f"{ratio:.1%}")     # 87.5%

表达式与函数调用

花括号内可以执行函数调用和其他更复杂的操作,但为了可读性,应保持简洁。

name = " bob "
def greet(person):
    return f"Hello, {person.strip().title()}!"

print(f"{greet(name)}")
# 输出:Hello, Bob!

也可以快速进行一些计算:

x = 10
print(f"x squared is {x ** 2}")  # x squared is 100

调试利器: = 说明符 (Python 3.8+)

Python 3.8 为 f-string 增加了一个极为实用的调试功能:= 说明符。它能够在输出时同时显示表达式文本和其计算结果,大幅简化打印调试。

基本用法

在表达式后添加 =,不加空格。

name = "Alice"
age = 30

print(f"{name=}  {age=}")
# 输出:name='Alice'  age=30

复杂表达式

对于表达式,它会保留表达式原本的文本。

x = 10
y = 3

print(f"{x + y = }")
# 输出:x + y = 13

print(f"{x > y = }")
# 输出:x > y = True

格式化调试输出

= 之后仍可接格式说明符,用于控制值的展示形式。

pi = 3.1415926
print(f"{pi=:.2f}")        # pi=3.14

name = "Python"
print(f"{name=:>10}")      # name=    Python  (注意整个表达式和值一起被格式化)

# 如果想分别控制表达式和值的显示,可以手动构建:
print(f"pi = {pi:.3f}")    # 传统方式更灵活

当你在快速调试时,= 的便利性无可替代,但需要精细控制输出格式时,传统格式说明符依然更合适。

多行 f-string 与特殊字符

f-string 可以跨越多行,使用三引号 """'''

name = "Alice"
age = 30

message = f"""
Name: {name}
Age:  {age}
Next year: {age + 1}
"""
print(message)

在 f-string 内部使用引号时,注意不要与外围引号冲突。可以使用反斜杠转义,但 Python 3.12 之后才正式支持嵌套相同的引号。通常推荐使用不同的引号类型。

text = f"He said, \"{name} is {age} years old.\""
# 或
text = f'He said, "{name} is {age} years old."'

反斜杠不能直接用在花括号内的表达式部分(Python 3.11 及之前),若需换行,可先将表达式赋值给变量。

# 错误示例(<=3.11):
# print(f"{name \n}")   # SyntaxError

# 正确做法:
nl = "\n"
print(f"{name}{nl}is{age}")

性能与最佳实践

  • f-string 在运行时会被直接解析为最终字符串,速度通常快于 %str.format()
  • 对于循环中大量拼接字符串的场景,使用 f-string 是高效的选择。
  • 避免在 f-string 内部执行耗时的操作或有副作用的函数(如修改全局变量),这会影响可读性和可维护性。
  • 调试时善用 = 说明符可以节省大量 print 语句。

总结

Python f-string 是现代 Python 开发中格式化字符串的首选工具。它语法自然、功能强大,并提供了独特的调试支持。

  • 基本语法f"text {expr}"
  • 格式化{expr:格式说明符},支持对齐、宽度、小数、进制等。
  • 调试{expr=} 直接输出变量名和值。
  • 高效简洁:比传统方法更快、更易读。

掌握 f-string 可以显著提升你的 Python 代码表达力和调试效率。