字符串格式化(string formatting)是将数据以可读方式嵌入文本的重要机制。
Python 最早期的实现方式沿袭自 C 语言的 printf(),语法如下:
"Hello, %s" % "world"这种写法在 Python 中被称为“printf 风格格式化”(printf-style formatting)。
它简洁、高效、与旧代码兼容,至今仍常用于脚本输出与日志记录。
1、语法原理:格式说明符
在 Python 中,% 操作符在字符串类型上被“重载”(overloaded)为格式化操作。
示例:
"Hello, %s" % "world"# 等价于:"Hello, %s".__mod__("world")它不是数学意义上的取模,而是一种格式化表达式(formatting expression),通过格式说明符(format specifier)控制输出格式。
其通用形式为:
"格式模板" % 数据🔹 左侧为模板字符串(format string),其中包含格式说明符。
🔹 右侧为数据部分(data),可以是单个值或元组。
2、格式说明符的基本结构
格式说明符的通用结构如下:
%[flags][width][.precision]type各部分含义:
🔹 %:起始符号,标志一个格式化占位符的开始。
🔹 flags:标志位,可选。控制对齐、符号显示、补零或进制前缀。
🔹 width:宽度,可选。指定输出的最小宽度。
🔹 .precision:精度,可选。控制小数位数或字符串长度。
🔹 type:类型码,必选,定义输出数据的类型或格式。
3、常见类型码
类型码决定如何将数据转换为字符串。
它们类似“格式模板”的指令,例如 %d 表示整数,%f 表示浮点数。
类型码 | 说明 | 示例 | 输出 |
|---|---|---|---|
%s | 使用 | "%s" % "Hi" | 'Hi' |
%r | 使用 | "%r" % "Hi" | "'Hi'" |
%d/ | 十进制整数 | "%d" % 42 | '42' |
%u | 无符号整数 (已废弃,等价于 | "%u" % -5 | '-5' |
%f | 浮点数 (默认保留 6 位小数) | "%f" % 3.14 | '3.140000' |
%e/ | 科学计数法表示 | "%.2E" % 1200 | '1.20E+03' |
%g/ | 自动选择 | "%g" % 0.0005 | '0.0005' |
%x/ | 十六进制整数 | "%X" % 255 | 'FF' |
%o | 八进制整数 | "%o" % 9 | '11' |
%% | 输出字面 | "%d%%" % 90 | '90%' |
提示:
%r 在调试输出中非常有用,可直接反映对象的原始表示形式。
4、flags 标志位
标志位是可选修饰符,用于控制输出的对齐方式、符号显示或填充字符。
多个标志可以组合使用,书写顺序通常无严格限制。
标志 | 功能 | 示例 | 输出 |
|---|---|---|---|
- | 左对齐 (默认右对齐) | "%-10s" % "Hi" | 'Hi ' |
+ | 为正数显示 | "%+d" % 42 | '+42' |
空格 | 在正数前添加空格 (仅当未使用 + 标志时有效) | "% d" % 42 | ' 42' |
0 | 用 | "%05d" % 7 | '00007' |
# | 显示进制前缀( | "%#x" % 255 | '0xff' |
示例:
print("%#08x" % 255)# 输出:0x0000ff解释:
# → 表示显示前缀 0x
0 → 表示用零填充
8 → 表示最小宽度为 8
5、宽度与精度控制
宽度(width)与精度(precision)是格式化的量化参数,用于控制数值的显示长度或字符串截断。
(1)输出宽度
定义最小宽度,不足则自动补空格或补零:
print("[%6d]" % 42) # [ 42]print("[%06d]" % 42) # [000042](2)小数精度
控制浮点数小数位数:
print("%.2f" % 3.14159) # 3.14print("%8.3f" % 3.14159) # 3.142(3)字符串截断
限定输出字符串的最大长度:
print("%.5s" % "HelloWorld") # Hello6、多个占位符
当模板字符串中包含多个格式控制符时,必须提供相应数量的参数,可使用元组或字典。
(1)元组传参(按顺序匹配)
template = "Name: %s, Age: %d, Score: %.1f"print(template % ("Alice", 23, 89.5))# Name: Alice, Age: 23, Score: 89.5(2)字典传参(按名称匹配)
student = {"name": "Bob", "score": 92.3}print("Student: %(name)s, Score: %(score).1f" % student)# Student: Bob, Score: 92.3命名替换方式更直观,尤其适用于模板或日志输出。
7、综合示例:表格输出
data = [ ("Alice", 95.2), ("Bob", 87.6), ("Carol", 92.8)]print("%-10s | %6s" % ("Name", "Score"))print("-" * 20)for name, score in data: print("%-10s | %6.2f" % (name, score))输出:
Name | Score--------------------Alice | 95.20Bob | 87.60Carol | 92.80📘 小结
% 在字符串中不是取模,而是格式控制符,在内部由字符串对象的 __mod__() 方法实现。
格式结构为:%[flags][width][.precision]type。
类型码控制数据类型显示方式,如 %s, %d, %f, %x 等。
标志位用于对齐、补零、符号显示或前缀输出。
它简洁、直观,是理解 Python 字符串格式化机制的基础。

“点赞有美意,赞赏是鼓励”
1330

被折叠的 条评论
为什么被折叠?



