← 返回首页
🐍

字符串格式化进阶

📂 python ⏱ 2 min 329 words

字符串格式化概述

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}岁"

最佳实践

掌握这些字符串格式化技术,能让你的Python代码更加清晰和专业。