Python f-string 的格式化和调试功能
Python f-string 格式化和调试功能完全指南
什么是 f-string
f-string(格式化字符串字面量)是 Python 3.6 引入的一种字符串格式化方式。它以 f 或 F 前缀开头,允许直接在字符串字面量中嵌入表达式,使代码更简洁、可读性更强。
相比传统的 % 格式化和 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 代码表达力和调试效率。