字符串格式化进阶
字符串格式化概述
Python提供了多种字符串格式化方法,每种都有其适用场景。了解它们的区别和用法对于编写清晰、高效的代码非常重要。
百分号格式化(%)
这是Python最早的格式化方式,类似于C语言的printf。
# 基本用法
name = "Alice"
age = 25
print("我叫%s,今年%d岁" % (name, age))
# 输出: 我叫Alice,今年25岁
# 格式化浮点数
pi = 3.14159
print("圆周率是%.2f" % pi)
# 输出: 圆周率是3.14
# 对齐和填充
print("%10s" % "hello") # 右对齐,宽度10
print("%-10s" % "hello") # 左对齐,宽度10
print("%010d" % 42) # 零填充,宽度10
# 输出:
# hello
# hello
# 0000000042
.format()方法
Python 3引入了更强大的.format()方法。
# 基本用法
name = "Bob"
age = 30
print("我叫{},今年{}岁".format(name, age))
# 输出: 我叫Bob,今年30岁
# 使用索引
print("{0}喜欢{1},{1}也喜欢{0}".format("Alice", "Python"))
# 输出: Alice喜欢Python,Python也喜欢Alice
# 使用关键字参数
print("{name}的成绩是{score}".format(name="Charlie", score=95))
# 输出: Charlie的成绩是95
# 格式化数字
pi = 3.14159
print("{:.2f}".format(pi)) # 输出: 3.14
print("{:10.2f}".format(pi)) # 输出: 3.14
print("{:<10.2f}".format(pi)) # 输出: 3.14
print("{:010.2f}".format(pi)) # 输出: 0000003.14
f-string(格式化字符串字面值)
Python 3.6引入的f-string是最现代、最高效的格式化方式。
# 基本用法
name = "David"
age = 28
print(f"我叫{name},今年{age}岁")
# 输出: 我叫David,今年28岁
# 表达式
x = 10
y = 5
print(f"{x} + {y} = {x + y}")
# 输出: 10 + 5 = 15
# 格式化数字
pi = 3.14159
print(f"圆周率是{pi:.2f}")
# 输出: 圆周率是3.14
# 对齐和填充
name = "Eve"
print(f"{name:>10}") # 右对齐
print(f"{name:<10}") # 左对齐
print(f"{name:^10}") # 居中对齐
# 输出:
# Eve
# Eve
# Eve
高级格式化技巧
多行f-string
# 多行f-string
name = "Frank"
age = 35
city = "北京"
info = f"""
姓名: {name}
年龄: {age}
城市: {city}
"""
print(info)
格式化规范
# 数字格式化
print(f"{1000000:,}") # 输出: 1,000,000(千位分隔符)
print(f"{0.25:.1%}") # 输出: 25.0%(百分比)
print(f"{255:08b}") # 输出: 11111111(二进制)
print(f"{255:02x}") # 输出: ff(十六进制)
# 日期格式化
from datetime import datetime
now = datetime.now()
print(f"{now:%Y-%m-%d %H:%M:%S}")
调试技巧
# f-string调试
name = "Grace"
age = 22
print(f"{name=}, {age=}")
# 输出: name='Grace', age=22
# 嵌套引号
print(f"{'hello':^10}") # 输出: hello
模板字符串
Python的string.Template模块提供了更安全的格式化方式,特别适合处理用户输入。
from string import Template
# 基本用法
template = Template("我叫$name,今年$age岁")
result = template.substitute(name="Henry", age=29)
print(result)
# 输出: 我叫Henry,今年29岁
# 安全替换
try:
result = template.safe_substitute(name="Ivy") # 缺少age参数
print(result) # 输出: 我叫Ivy,今年$age岁
except KeyError as e:
print(f"缺少参数: {e}")
实际应用案例
# 1. 生成SQL查询
table = "users"
columns = ["id", "name", "email"]
where = "age > 18"
query = f"SELECT {', '.join(columns)} FROM {table} WHERE {where}"
print(query)
# 输出: SELECT id, name, email FROM users WHERE age > 18
# 2. 格式化报告
data = [
{"name": "产品A", "sales": 1500, "growth": 0.15},
{"name": "产品B", "sales": 2300, "growth": 0.08},
]
print(f"{'产品':<10}{'销售额':>10}{'增长率':>10}")
print("-" * 30)
for item in data:
print(f"{item['name']:<10}{item['sales']:>10,}{item['growth']:>10.1%}")
性能比较
import timeit
name = "Alice"
age = 25
# 百分号格式化
%timeit "我叫%s,今年%d岁" % (name, age)
# .format()方法
%timeit "我叫{},今年{}岁".format(name, age)
# f-string
%timeit f"我叫{name},今年{age}岁"
最佳实践
- 优先使用f-string,简洁高效
- 需要安全性时使用模板字符串
- 保持格式化风格一致
- 避免在格式化中包含复杂逻辑
掌握这些字符串格式化技术,能让你的Python代码更加清晰和专业。