字符串格式化

方法 Python 版本 示例
% 运算符格式化 Python 2+ "Hello %s" % name
str.format() 方法 Python 2.6+ "Hello {}".format(name)
f-string(格式化字符串字面量) Python 3.6+ f"Hello {name}"

方式一:旧式 C 风格的 % 格式化

Python 最早的字符串格式化方式,语法类似于 C 语言的 printf

基本用法

1
2
3
name = "Alice"
age = 25
print("My name is %s and I'm %d years old." % (name, age))

输出:

1
My name is Alice and I'm 25 years old.

常见格式说明符

符号 含义 示例
%s 字符串(str()) %s
%r 原始表示(repr()) %r
%d 十进制整数 %d
%f 浮点数 %f
%.2f 浮点数,保留 2 位小数 %.2f
%x / %X 十六进制整数(小写/大写) %x, %X

格式控制

1
2
3
print("%10s" % "hi")      # 右对齐,占 10 格
print("%-10s" % "hi") # 左对齐,占 10 格
print("%06d" % 42) # 前导补零:000042

输出:

1
2
3
        hi
hi
000042

缺点

  • 可读性差。
  • 不支持命名参数(需要位置顺序)。
  • 现代 Python 中已不推荐使用(仅为兼容旧代码)。

方式二:str.format() 方法

自 Python 2.6 起引入,功能更强大、可读性更好。

基本用法

1
2
3
name = "Bob"
age = 30
print("My name is {} and I'm {} years old.".format(name, age))

输出:

1
My name is Bob and I'm 30 years old.

位置参数与关键字参数

1
2
print("Hello {0}, you are {1}".format("Alice", 25))
print("Hello {name}, you are {age}".format(name="Alice", age=25))

输出:

1
2
Hello Alice, you are 25
Hello Alice, you are 25

高级格式控制

基本语法:

1
{字段名:格式说明}

格式说明符结构:

1
[[fill][align][sign][#][0][width][,][.precision][type]

让我们逐项解释 👇

部分 含义 示例
fill 填充字符 {:*>5}**123
align 对齐方式:<左对齐,>右对齐,^居中 {:>10}
sign 符号:+总带符号,-仅负数,空格正数空一格 {:+d}
width 最小宽度 {:8d}
, 千位分隔符 {:,.2f}
.precision 精度(小数位数) {:.3f}
type 类型(d, f, e, x 等) {:x}{:.2%}

数值格式化

1
2
3
4
5
print("整数:{:d}".format(42))
print("浮点数:{:.2f}".format(3.14159))
print("百分比:{:.1%}".format(0.123))
print("十六进制:{:x}".format(255))
print("千位分隔符:{:,}".format(1234567))

输出:

1
2
3
4
5
整数:42
浮点数:3.14
百分比:12.3%
十六进制:ff
千位分隔符:1,234,567

对齐与填充

1
2
3
4
print("{:<10}".format("左对齐"))
print("{:>10}".format("右对齐"))
print("{:^10}".format("居中"))
print("{:*^10}".format("装饰"))

输出:

1
2
3
4
左对齐      
右对齐
居中
***装饰***

访问对象或字典属性

1
2
person = {"name": "Tom", "age": 22}
print("Name: {p[name]}, Age: {p[age]}".format(p=person))

或对象属性:

1
2
3
4
5
6
7
class User:
def __init__(self, name, score):
self.name = name
self.score = score

u = User("Anna", 98)
print("User: {0.name}, Score: {0.score}".format(u))

方式三:Python 3.6+ 的 f-string

基本用法

1
2
3
name = "Alice"
age = 25
print(f"My name is {name} and I'm {age} years old.")

输出:

1
My name is Alice and I'm 25 years old.

支持嵌入表达式

1
2
x, y = 5, 10
print(f"{x} + {y} = {x + y}")

输出:

1
5 + 10 = 15

支持函数调用

1
2
def greet(name): return f"Hi, {name}!"
print(f"{greet('Bob')}, welcome!")

支持格式说明符

1
2
3
4
5
pi = 3.14159265
print(f"{pi:.2f}") # 保留 2 位小数
print(f"{pi:10.3f}") # 总宽 10,保留 3 位
print(f"{1000000:,}") # 千位分隔符
print(f"{0.1234:.1%}") # 百分比

输出:

1
2
3
4
3.14
3.142
1,000,000
12.3%

表达式调试

Python 3.8+ 新特性,使用 = 可以同时输出表达式和结果,非常方便调试:

1
2
3
x = 10
y = 20
print(f"{x=}, {y=}, {x+y=}")

输出:

1
x=10, y=20, x+y=30

多行 f-string

1
2
3
4
5
6
name = "Alice"
age = 25
print(f"""
Name: {name}
Age: {age}
""")

datetime 格式化结合

1
2
3
from datetime import datetime
now = datetime.now()
print(f"Current time: {now:%Y-%m-%d %H:%M:%S}")

输出:

1
Current time: 2025-10-17 14:23:12

比较三种方式

特性 % 格式化 str.format() f-string
可读性 较低 较高 最高
支持表达式 部分支持
命名参数
计算性能
Python 版本 所有 ≥2.6 ≥3.6
推荐程度 不推荐 推荐 最推荐

总结与建议

需求 推荐方式 示例
Python 3.6+ ✅ f-string f"Hello {name}"
兼容旧代码 .format() "Hello {}".format(name)
简单调试 f-string with = f"{var=}"
格式控制复杂 .format() / f-string f"{x:,.2f}"