Python 字符串格式化

来自 Python 3 文档

这里描述的格式化操作(% 运算符)表现出各种怪癖,导致许多常见错误 […]。使用较新的 格式化字符串字面量 […] 有助于避免这些错误。这些替代方案还为文本格式化提供了更强大、更灵活和可扩展的方法。

% operator

首选字符串字面量

对于新代码,强烈建议使用 str.format格式化字符串字面量 (Python 3.6+) 而不是 % 运算符。

# % operator: 旧式字符串格式化(不推荐用于新代码)
name = 'Pete'
'Hello %s' % name  # %s = 字符串占位符
"Hello Pete"

我们可以使用 %d 格式说明符将 int 值转换为字符串:

num = 5
'I have %d apples' % num
"I have 5 apples"

str.format

Python 3 引入了一种新的字符串格式化方式,后来向后移植到 Python 2.7。这使得字符串格式化的语法更加规范。

# str.format() 方法:现代字符串格式化 (Python 2.7+)
name = 'John'
age = 20

"Hello I'm {}, my age is {}".format(name, age)  # {} = 占位符
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"

Formatted String Literals or f-Strings

如果使用 Python 3.6+,字符串 f-Strings 是格式化字符串的推荐方式。

来自 Python 3 文档

格式化字符串字面量或 f 字符串是前缀为 fF 的字符串字面量。这些字符串可以包含替换字段,即由花括号 {} 分隔的表达式。虽然其他字符串字面量总是具有恒定值,但格式化字符串实际上是在运行时求值的表达式。

# f-string: 格式化字符串的推荐方式 (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!'  # f 前缀允许在 {} 中使用表达式
'Hello Elizabeth!'
测验

登录后即可答题并追踪学习进度

Python 中 f-string 使用的前缀是什么?
A. fmt
B. fF
C. format
D. str

它甚至可以在其中进行内联算术运算:

# f-strings 支持表达式:可以在 {} 内部包含计算
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.'  # 评估表达式
'Five plus ten is 15 and not 30.'

多行 f-Strings

name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'

= 说明符

这将打印表达式及其值:

# = 说明符:打印变量名和值 (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}'  # 打印 "now='Nov/14/2022 - 20:50:01'"
"date and time: now='Nov/14/2022 - 20:50:01'"

添加空格或字符

name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() =        ROBERT       '
f"{name.upper() = :20}"
'name.upper() = ROBERT              '

格式化数字

添加千位分隔符

a = 10000000
f"{a:,}"
'10,000,000'

四舍五入

a = 3.1415926
f"{a:.2f}"
'3.14'
测验

登录后即可答题并追踪学习进度

f"{a:.2f}" 的作用是什么?
A. 将数字四舍五入到最接近的整数
B. 格式化为百分比
C. 将数字格式化为带有 2 位小数的浮点数
D. 转换为科学记数法

显示为百分比

a = 0.816562
f"{a:.2%}"
'81.66%'

数字格式化表

数字格式输出描述
3.1415926{:.2f}3.14格式化浮点数,保留 2 位小数
3.1415926{:+.2f}+3.14格式化浮点数,保留 2 位小数并显示符号
-1{:+.2f}-1.00格式化浮点数,保留 2 位小数并显示符号
2.71828{:.0f}3格式化浮点数,不保留小数位
4{:0>2d}04用零填充数字(左填充,宽度为 2)
4{:x<4d}4xxx用 x 填充数字(右填充,宽度为 4)
10{:x<4d}10xx用 x 填充数字(右填充,宽度为 4)
1000000{:,}1,000,000带逗号分隔符的数字格式
0.35{:.2%}35.00%格式化百分比
1000000000{:.2e}1.00e+09指数表示法
11{:11d}11右对齐(默认,宽度为 10)
11{:<11d}11左对齐(宽度为 10)
11{:^11d}11居中对齐(宽度为 10)

Template Strings

一种更简单、功能较弱的机制,但在处理用户生成的字符串时推荐使用。由于其复杂性较低,模板字符串是更安全的选择。

from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'

相关链接