特性 | % 操作符 | str.format() | f-string (Python 3.6+) |
|---|---|---|---|
可读性 | 低 | 中 | 高 |
灵活性 | 低 | 中 | 高 |
性能 | 中 | 低 | 高 |
表达式支持 | ❌ | 有限 | ✅ |
变量名重复使用 | ❌ | ✅ | ✅ |
对齐/填充 | 有限支持 | ✅ | ✅ |
类型转换 | 有限支持 | ✅ | ✅ |
日期格式化 | 单独处理 | 单独处理 | 内联支持 |
name = "拾光"
age = 18
# 基本用法
print("Hello, %s!" % name) # Hello, Alice!
print("%s is %d years old" % (name, age))
# 格式化选项
print("%10s" % name) # 右对齐: ' 拾光'
print("%-10s" % name) # 左对齐: '拾光 '
print("%.2f" % 3.14159) # 浮点数精度: '3.14'
# 字典格式化
print("%(name)s: %(age)d" % {"name": name, "age": age})# 位置参数
print("{} is {} years old".format(name, age))
# 命名参数
print("{name} works as {job}".format(name="Bob", job="engineer"))
# 索引重用
print("{0} {1} {0}".format("a", "b")) # a b a
# 格式化选项
print("{:.2f}".format(3.14159)) # 3.14
print("{:>10}".format(name)) # 右对齐: ' 拾光'
print("{:<10}".format(name)) # 左对齐: '拾光 '
print("{:^10}".format(name)) # 居中: ' 拾光 '
print("{:,}".format(1000000)) # 千分位: 1,000,000
# 类型转换
print("{!r}".format("text")) # 调用repr(): 'text'# 变量直接嵌入
print(f"{name} is {age} years old")
# 表达式计算
print(f"Next year {name} will be {age + 1}")
# 调用函数
print(f"Name uppercase: {name.upper()}")
# 多行f-string
message = (
f"User: {name}\n"
f"Age: {age}\n"
f"Status: {'Adult' if age >= 18 else 'Minor'}"
)# 数字格式化
pi = 3.1415926
print(f"Pi: {pi:.3f}") # Pi: 3.142
print(f"Hex: {255:#x}") # Hex: 0xff
# 对齐与填充
print(f"{name:>15}") # 右对齐: ' 拾光'
print(f"{name:*<10}") # 左填充: '拾光*****'
# 日期格式化
from datetime import datetime
now = datetime.now()
print(f"Today: {now:%Y-%m-%d %H:%M}") # Today: 2025-06-17 12:30
# 原始字符串 (处理特殊字符)
path = r"d:\folder"
print(fr"Path: {path}") # Path: d:\folder
# 字典操作
user = {"name": "Alice", "age": 30}
print(f"{user['name']}: {user['age']}")# 在format规范中嵌套变量
width = 10
precision = 3
print(f"{pi:{width}.{precision}f}") # ' 3.142'
# 条件表达式
count = 5
print(f"You have {count} item{'s' if count != 1 else ''}")1. 复杂格式化场景:
# 复杂逻辑预处理
discount_rate = 0.15 if is_member else 0.05
total = price * quantity * (1 - discount_rate)
print(f"Final price: {total:.2f}")2. SQL/Shell 命令:使用 f-string 但要防注入
# 危险!可能SQL注入
query = f"SELECT * FROM users WHERE name = '{name}'"
# 安全做法
query = "SELECT * FROM users WHERE name = %s"
cursor.execute(query, (name,))问题:大括号字面量如何显示?
print(f"{{}} = braces") # {} = braces问题:浮点数精度问题
num = 0.1 + 0.2
print(f"{num:.1f}") # 0.3 (显示修正)
print(f"{num}") # 0.30000000000000004问题:调试快速查看变量
x = 42
print(f"{x = }") # x = 42 (Python 3.8+)问题:格式化None值
value = None
print(f"Value: {value or 'N/A'}") # Value: N/A问题:超长数字可读性
big_num = 10**9
print(f"{big_num:,}") # 1,000,000,000
print(f"{big_num:_}") # 1_000_000_000掌握 f-string 能让你的 Python 代码更简洁、高效、可读
#Python