Python format 格式化函数(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Python 开发中,数据格式化是一个高频需求。无论是构建用户友好的输出界面,还是生成结构化的日志文件,甚至是处理复杂的金融计算,掌握 format()
函数都能显著提升代码的可读性和功能性。本文将系统性地解析 format()
函数的核心机制,并通过大量实战案例,帮助读者从基础语法到高级技巧全面掌握这一工具。
一、基础语法:占位符的魔法
1.1 格式化字符串的诞生
Python 的 format()
函数通过 占位符(placeholder)实现数据嵌入。最简单的形式是:
text = "Hello, {}!".format("World")
print(text) # 输出:Hello, World!
这里 {}
是一个空占位符,通过 .format()
方法传递参数后,参数会按顺序填充进占位符中。
1.2 参数与位置的映射
占位符可以显式指定参数位置,避免顺序依赖:
sentence = "第{1}位用户 {0} 在{2}登录".format("Alice", 100, "2023-09-20")
print(sentence) # 输出:第100位用户 Alice 在2023-09-20登录
这种灵活性在需要复用参数或调整输出顺序时非常实用。
二、进阶用法:格式说明符的控制
2.1 格式说明符的结构
在 {}
内,通过 :
分隔参数索引和格式说明符(format specifier),例如:
number = 123.4567
formatted = "{:.2f}".format(number)
print(formatted) # 输出:123.46
这里 .2f
表示保留两位小数的浮点数格式。
2.2 常见数值格式化场景
a. 浮点数精度控制
print("{:.2f}".format(123.456)) # 123.46
print("{:.2f}".format(123.4)) # 123.40
b. 整数的进制转换
decimal = 255
print("十进制:{}".format(decimal)) # 255
print("二进制:{0:b}".format(decimal)) # 11111111
print("十六进制:{0:x}".format(decimal)) # ff
c. 百分比格式化
ratio = 0.75
print("{:.0%}".format(ratio)) # 75%
三、对齐与填充:让输出更整洁
3.1 基本对齐规则
通过 <
、>
、^
控制文本对齐方向:
text = "Python"
print("|{:<10}|".format(text)) # 左对齐,总宽度10 → |Python |
print("|{:^10}|".format(text)) # 居中对齐 → | Python |
print("|{:>10}|".format(text)) # 右对齐 → | Python|
3.2 填充字符的扩展
默认填充为空格,可替换为其他字符(如 =
、0
):
print("编号:{:0>5}".format(42)) # 编号:00042
print("{:=^20}".format(" 销售报表 ")) # =====销售报表=====
四、格式化复杂数据类型
4.1 字典与对象的键访问
通过 []
或 .
访问对象属性或字典键值:
user = {"name": "Bob", "age": 30}
print("姓名:{name}, 年龄:{age}".format(**user)) # 姓名:Bob, 年龄:30
class Person:
def __init__(self, name):
self.name = name
person = Person("Charlie")
print("用户:{.name}".format(person)) # 用户:Charlie
4.2 列表与元组的索引访问
items = ["apple", "banana", "cherry"]
print("第二个元素:{[1]}".format(items)) # 第二个元素:banana
五、格式化函数的进阶技巧
5.1 格式化嵌套
通过多层占位符实现复杂结构:
report = (
"销售数据:\n"
" - 总额:{total:.2f} 元\n"
" - 利润率:{profit:.1%}\n"
" - 员工:{employee[name]}\n"
" - 部门:{employee[department]}".format(
total=12345.678,
profit=0.25,
employee={"name": "David", "department": "Sales"}
)
)
print(report)
输出结果:
销售数据:
- 总额:12345.68 元
- 利润率:25.0%
- 员工:David
- 部门:Sales
5.2 格式化日期与时间
结合 datetime
模块实现日期格式化:
from datetime import datetime
now = datetime.now()
print("当前时间:{:%Y-%m-%d %H:%M:%S}".format(now))
六、与 f-string 的对比与选择
6.1 f-string 的语法优势
Python 3.6 引入的 f-string(格式化字符串字面值)在语法上更简洁:
name = "Eva"
age = 25
print(f"用户 {name} 的年龄是 {age} 岁") # 用户 Eva 的年龄是 25 岁
6.2 格式化函数的适用场景
尽管 f-string 更简洁,但 format()
函数在以下场景更具优势:
- 动态占位符:当需要根据变量名动态生成占位符时;
- 复杂嵌套:处理多层嵌套结构时,
format()
的参数传递更直观; - 兼容性:在旧版 Python(<3.6)中,
format()
是唯一选择。
七、常见问题与解决方案
7.1 "Format specifier needs more arguments" 错误
当占位符数量超过传递的参数时会触发此错误:
print("{0} {1}".format("仅传入一个参数")) # 报错!
解决方法:确保参数数量与占位符匹配。
7.2 处理特殊字符(如 {}
)
若需在字符串中直接显示 {}
,可用 {{}}
转义:
print("价格:{{ price }} 元".format()) # 输出:价格:{ price } 元
八、实战案例:构建财务报表
8.1 需求描述
生成一份包含金额、百分比、日期的财务报告:
from datetime import datetime
data = {
"revenue": 1234567.89,
"cost": 456789.12,
"profit_ratio": 0.65,
"report_date": datetime.now()
}
report = (
"财务报告:{report_date:%Y年%m月%d日}\n"
"总收入:{revenue:,.2f} 元\n"
"总成本:{cost:,.2f} 元\n"
"净利润率:{profit_ratio:.0%}\n"
"-----------------------\n"
"净收入:{:.2f} 元".format(
data["revenue"] - data["cost"],
**data
)
)
print(report)
输出示例:
财务报告:2023年09月20日
总收入:1,234,567.89 元
总成本:456,789.12 元
净利润率:65%
-----------------------
净收入:777,778.77 元
结论
Python format 格式化函数是一个功能强大且灵活的工具,其核心在于 占位符语法 和 格式说明符 的组合应用。无论是基础的字符串拼接,还是复杂的财务报表生成,通过本文的系统性讲解,读者可以逐步掌握从简单到复杂的格式化技巧。建议读者通过实际项目不断练习,例如开发日志记录系统、生成数据报告等场景,以深化对 format()
函数的理解。
掌握这些技能后,开发者不仅能写出更优雅的代码,还能显著提升输出内容的可读性和专业性——这正是 Python format 格式化函数赋予我们的强大能力。