Python:printf 风格字符串格式化(% 格式控制符)

字符串格式化(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

使用 str() 转为字符串

"%s" % "Hi"'Hi'
%r

使用 repr() 转为调试字符串

"%r" % "Hi""'Hi'"
%d/%i

十进制整数

"%d" % 42'42'
%u

无符号整数

(已废弃,等价于 %d

"%u" % -5'-5'
%f

浮点数

(默认保留 6 位小数)

"%f" % 3.14'3.140000'
%e/%E

科学计数法表示

"%.2E" % 1200'1.20E+03'
%g/%G

自动选择 %f 或 %e 表示法

"%g" % 0.0005'0.0005'
%x/%X

十六进制整数

"%X" % 255'FF'
%o

八进制整数

"%o" % 9'11'
%%

输出字面 % 符号

"%d%%" % 90'90%'

提示:

%r 在调试输出中非常有用,可直接反映对象的原始表示形式。

4、flags 标志位

标志位是可选修饰符,用于控制输出的对齐方式、符号显示或填充字符。

多个标志可以组合使用,书写顺序通常无严格限制。

标志

功能

示例

输出

-

左对齐

(默认右对齐)

"%-10s" % "Hi"'Hi        '
+

为正数显示 + 号

"%+d" % 42'+42'

空格

在正数前添加空格

(仅当未使用 + 标志时有效)

"% d" % 42' 42'
0

用 0 填充宽度(仅数字)

"%05d" % 7'00007'
#

显示进制前缀(0x0o 等)

"%#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")  # Hello

6、多个占位符

当模板字符串中包含多个格式控制符时,必须提供相应数量的参数,可使用元组或字典。

(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 字符串格式化机制的基础。

图片

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值