format()
函数高级字符串格式化详解format()
是Python中功能强大的字符串格式化工具,它提供了比传统%
格式化更灵活、更强大的方式来处理字符串格式化。下面我将从基础到高级全面讲解format()
函数的使用方法。
format()
函数基础用法"模板字符串".format(参数1, 参数2, ...)
print("{}的{}成绩是{}".format("张三", "数学", 95))
# 输出: 张三的数学成绩是95
print("{0}的{2}成绩是{1}".format("张三", 95, "数学"))
# 输出: 张三的数学成绩是95
print("{name}的{subject}成绩是{score}".format(
name="李四",
subject="英语",
score=88
))
# 输出: 李四的英语成绩是88
"{:[填充][对齐][符号][宽度][,][.精度][类型]}".format(数字)
格式化需求 | 格式字符串 | 示例代码 | 输出结果 |
---|---|---|---|
保留2位小数 | {:.2f} |
"{:.2f}".format(3.14159) |
3.14 |
千分位分隔 | {:,} |
"{:,}".format(1234567) |
1,234,567 |
百分比显示 | {:.2%} |
"{:.2%}".format(0.4567) |
45.67% |
十六进制 | {:x} |
"{:x}".format(255) |
ff |
二进制 | {:b} |
"{:b}".format(10) |
1010 |
科学计数法 | {:.2e} |
"{:.2e}".format(123456) |
1.23e+05 |
格式化需求 | 格式字符串 | 示例代码 | 输出结果 |
---|---|---|---|
右对齐(默认) | {:10} |
"{:10}".format(123) |
123 |
左对齐 | {:<10} |
"{:<10}".format(123) |
123 |
居中对齐 | {:^10} |
"{:^10}".format(123) |
123 |
用0填充 | {:010} |
"{:010}".format(123) |
0000000123 |
用*填充 | {:*^10} |
"{:*^10}".format(123) |
***123**** |
# 综合示例:银行金额显示
amount = 1234567.8912
print("账户余额: {:,.2f}元".format(amount))
# 输出: 账户余额: 1,234,567.89元
格式化需求 | 格式字符串 | 示例代码 | 输出结果 |
---|---|---|---|
右对齐 | {:>10} |
"{:>10}".format("hello") |
hello |
左对齐 | {:<10} |
"{:<10}".format("hello") |
hello |
居中对齐 | {:^10} |
"{:^10}".format("hello") |
hello |
截断字符串 | {:.3} |
"{:.3}".format("hello") |
hel |
# 表格格式化示例
data = [("苹果", 5.5, 10), ("香蕉", 3.2, 8), ("橙子", 4.8, 15)]
for item in data:
print("{:<8} 单价: {:>5.2f}元 库存: {:03d}".format(*item))
# 输出:
# 苹果 单价: 5.50元 库存: 010
# 香蕉 单价: 3.20元 库存: 008
# 橙子 单价: 4.80元 库存: 015
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("王五", 30)
print("{0.name}今年{0.age}岁".format(p))
# 输出: 王五今年30岁
data = {"name": "赵六", "score": 92}
print("学生{name}的成绩是{score}".format(**data))
# 输出: 学生赵六的成绩是92
items = ["手机", "电脑", "平板"]
print("产品1: {0[0]}, 产品2: {0[1]}".format(items))
# 输出: 产品1: 手机, 产品2: 电脑
# 根据条件动态设置格式
for num in [123, 12345, 1234567]:
print("{:{align}{width},}".format(num, align=">", width=10))
# 输出:
# 123
# 12,345
# 1,234,567
# 显示大括号本身
print("{{}}是format使用的括号".format())
# 输出: {}是format使用的括号
from datetime import datetime
now = datetime.now()
print("{:%Y-%m-%d %H:%M:%S}".format(now))
# 输出: 2023-08-15 14:30:45 (当前时间)
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
def __format__(self, format_spec):
if format_spec == "f":
return f"{self.celsius * 9/5 + 32:.1f}°F"
return f"{self.celsius:.1f}°C"
temp = Temperature(25)
print("温度: {:f}".format(temp)) # 输出: 温度: 77.0°F
print("温度: {}".format(temp)) # 输出: 温度: 25.0°C
格式化方式 | Python版本 | 可读性 | 性能 | 功能 |
---|---|---|---|---|
%格式化 | 所有版本 | 一般 | 快 | 有限 |
str.format() | 2.6+ | 好 | 中 | 强大 |
f-string | 3.6+ | 最好 | 最快 | 强大 |
format()
✅ 适合场景:
❌ 不适合场景:
# 销售报表生成
sales_data = [
("笔记本电脑", 12, 5999.99),
("智能手机", 25, 3999.50),
("平板电脑", 8, 2999.00)
]
# 表头
print("{:<15} {:>10} {:>15} {:>15}".format(
"产品名称", "销售数量", "单价", "总金额"))
print("-" * 60)
# 表格内容
for product, quantity, price in sales_data:
total = quantity * price
print("{:<15} {:>10d} {:>15,.2f} {:>15,.2f}".format(
product, quantity, price, total))
# 输出示例:
# 产品名称 销售数量 单价 总金额
# ------------------------------------------------------------
# 笔记本电脑 12 5,999.99 71,999.88
# 智能手机 25 3,999.50 99,987.50
# 平板电脑 8 2,999.00 23,992.00
def log_message(level, message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("[{:<5}] {:<20} {}".format(level, timestamp, message))
log_message("INFO", "系统启动完成")
log_message("ERROR", "文件打开失败")
# 输出示例:
# [INFO ] 2023-08-15 14:45:30 系统启动完成
# [ERROR] 2023-08-15 14:46:12 文件打开失败
format()
函数核心要点:
{}
、索引参数{0}
、命名参数{name}
{:.2f}
{:,}
{:0>10}
{:<10}
、截断{:.5}
{obj.attr}
{:{width}}
__format__
方法format()
提供了Python中最强大、最灵活的字符串格式化能力,特别适合需要复杂格式控制的场景。虽然Python 3.6+引入了更简洁的f-string,但在需要复用格式模板或兼容旧版本Python时,format()
仍然是不可或缺的工具。