字符串格式化
| 方法 |
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") print("%-10s" % "hi") print("%06d" % 42)
|
输出:
缺点
- 可读性差。
- 不支持命名参数(需要位置顺序)。
- 现代 Python 中已不推荐使用(仅为兼容旧代码)。
自 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
| [[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
| 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 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}") print(f"{pi:10.3f}") 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=}")
|
输出:
多行 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}" |