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 字符串是前缀为 f 或 F 的字符串字面量。这些字符串可以包含替换字段,即由花括号 {} 分隔的表达式。虽然其他字符串字面量总是具有恒定值,但格式化字符串实际上是在运行时求值的表达式。
# f-string: 格式化字符串的推荐方式 (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!' # f 前缀允许在 {} 中使用表达式
'Hello Elizabeth!'
测验
登录后即可答题并追踪学习进度
Python 中 f-string 使用的前缀是什么?
A.
fmtB.
f 或 FC.
formatD.
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!'