介绍
欢迎来到 Python 字符串格式化(String Formatting)实验(Lab)。正确地格式化字符串是任何编程语言中的一项基本任务,它被用于从简单的打印语句到生成复杂的报告和网页的各种场景。Python 提供了多种格式化字符串的方法,每种方法都有其自身的优势和用例。
在这个实验中,你将探索 Python 中字符串格式化的演变过程。你将从传统的 % 操作符开始,然后转向更灵活的 str.format() 方法。你还将掌握 f-Strings,这是 Python 3.6 中引入的现代且推荐的方法,并学习如何有效地格式化数字。最后,你将了解 Template 字符串,这是处理来自不可信源的模板时的一种安全选项。
完成本实验后,你将对如何在你的 Python 项目中选择和使用正确的字符串格式化技术有一个全面的理解。
使用 % 运算符
在这一步,你将学习使用 % 运算符的旧式字符串格式化方法。这种方法继承自 C 语言的 printf 函数,它使用格式说明符(format specifiers),如 %s 代表字符串和 %d 代表整数,将值插入到字符串中。
尽管这种方法有效,但它有一些怪癖,并且不如现代的替代方案灵活。对于新代码,强烈建议使用 f-Strings 或 str.format()。
注意: 如果你不熟悉使用 WebIDE(类似 VS Code),请先在 这个实验 中学习。
首先,从左侧的文件浏览器中打开文件 step1.py。
现在,将以下代码添加到 step1.py 中,以查看如何格式化字符串和整数。
## % 运算符:旧式字符串格式化(不推荐用于新代码)
name = 'Pete'
print('Hello %s' % name) ## %s = 字符串占位符
num = 5
print('I have %d apples' % num) ## %d = 整数占位符
保存文件并从终端运行它以查看输出。
python3 step1.py
你应该会看到以下输出,其中 %s 已被 name 的值替换,%d 已被 num 的值替换。
Hello Pete
I have 5 apples
使用 str.format
在这一步,你将探索 str.format() 方法。该方法在 Python 3 中引入(并向后移植到 2.7),作为一种更强大、更灵活的字符串格式化方式。此方法使用花括号 {} 作为占位符。
你可以将参数传递给 format(),它们将按顺序插入到占位符中。你也可以在花括号内使用数字来按位置引用参数。
从文件浏览器中打开文件 step2.py。
将以下代码添加到 step2.py 中。第一个示例使用空花括号,第二个示例使用位置参数。
## str.format() 方法:现代字符串格式化 (Python 2.7+)
name = 'John'
age = 20
## 参数按顺序插入
print("Hello I'm {}, my age is {}".format(name, age))
## 参数根据位置插入
print("Hello I'm {0}, my age is {1}".format(name, age))
保存文件并在终端中执行它。
python3 step2.py
两个打印语句将产生相同的结果,展示了使用 str.format() 的两种方式。
Hello I'm John, my age is 20
Hello I'm John, my age is 20
格式化字符串字面量或 f-Strings
在这一步,你将掌握 f-Strings,它是 Python 3.6 及更高版本中推荐的字符串格式化方式。f-String 是一个以 f 或 F 为前缀的字符串字面量。这些字符串允许你直接在其中嵌入 Python 表达式,表达式用花括号 {} 括起来。
f-Strings 在运行时进行求值,这不仅使它们简洁易读,而且非常强大。
从文件浏览器中打开文件 step3.py。
基本语法和表达式
首先,我们来看一下基本语法以及如何嵌入表达式。将以下代码添加到 step3.py 中。
## f-string: 推荐的字符串格式化方式 (Python 3.6+)
name = 'Elizabeth'
print(f'Hello {name}!') ## f 前缀允许在 {} 中使用表达式
## f-strings 支持表达式:可以在 {} 内部包含计算
a = 5
b = 10
print(f'Five plus ten is {a + b} and not {2 * (a + b)}.')
多行 f-Strings
你也可以通过用圆括号将 f-String 括起来来创建多行字符串。将此示例添加到 step3.py 中。
name = 'Robert'
messages = 12
multiline_string = (
f'Hi, {name}. '
f'You have {messages} unread messages'
)
print(multiline_string)
用于调试的 = 说明符
从 Python 3.8 开始,你可以使用 = 说明符来自动打印表达式及其值,这对调试非常有用。将最后这部分代码添加到 step3.py 中。
## = 说明符:打印变量名和值 (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
print(f'date and time: {now=}')
现在,保存文件并在终端中运行它。
python3 step3.py
你将看到所有三个示例的输出。请注意,你输出中的日期和时间会有所不同。
Hello Elizabeth!
Five plus ten is 15 and not 30.
Hi, Robert. You have 12 unread messages
date and time: now='...'
格式化数字
在这一步,你将学习如何在 f-Strings 中格式化数值数据。这是以人类可读的格式呈现数据的强大功能。我们将介绍添加千位分隔符、对浮点数进行四舍五入以及将数字显示为百分比。
从文件浏览器中打开文件 step4.py。
将以下代码添加到 step4.py 中,以练习不同的数字格式化技术。
## 添加千位分隔符
a = 10000000
print(f"Number with separators: {a:,}")
## 将浮点数四舍五入到小数点后 2 位
b = 3.1415926
print(f"Rounded number: {b:.2f}")
## 将数字显示为百分比,保留 2 位小数
c = 0.816562
print(f"As a percentage: {c:.2%}")
每个格式说明符(format specifier)都跟在花括号 {} 内的冒号 : 后面。
:,添加逗号作为千位分隔符。:.2f将数字格式化为带有两位小数的浮点数。:.2%将数字乘以 100 并显示为带有两位小数的百分比。
保存文件并在终端中运行它。
python3 step4.py
你的输出应该如下所示:
Number with separators: 10,000,000
Rounded number: 3.14
As a percentage: 81.66%
供你参考,下表列出了 f-Strings 中更多可用的数字格式化选项:
| 数字 | 格式 | 输出 | 描述 |
|---|---|---|---|
| 3.1415926 | {:.2f} |
3.14 | 格式化浮点数,保留 2 位小数 |
| 1000000 | {:,} |
1,000,000 | 带逗号分隔符的数字格式 |
| 0.35 | {:.2%} |
35.00% | 格式化百分比 |
| 1000000000 | {:.2e} |
1.00e+09 | 指数表示法 (Exponent notation) |
使用 Template 字符串
在这一步,你将了解 Python 内置的 string 模块中的 Template 字符串。虽然它们的功能不如 f-Strings 强大,但在处理可能由用户生成的字符串模板时,它们是更安全的选择。它们简化的复杂性可以防止执行任意代码,而使用 str.format() 等方法如果不小心,可能会带来安全风险。
Template 字符串使用美元符号 $ 来标记占位符(例如,$name)。
从文件浏览器中打开文件 step5.py。
将以下代码添加到 step5.py 中。你需要导入 Template 类,创建一个模板对象,然后使用 substitute() 方法来插入值。
from string import Template
name = 'Elizabeth'
## 创建一个 Template 对象
t = Template('Hey $name!')
## 使用 substitute() 方法替换占位符
result = t.substitute(name=name)
print(result)
substitute() 方法接受关键字参数(keyword arguments),其中键(keys)与模板中的占位符名称相匹配。
保存文件并在终端中运行它。
python3 step5.py
输出将显示替换后的字符串。
Hey Elizabeth!
总结
恭喜你完成了 Python 字符串格式化实验!
在这个实验中,你探索了 Python 中格式化字符串的主要方法。你学习了:
%运算符:传统的 C 风格格式化,在新代码中已不再推荐使用。str.format()方法:一种更强大、更灵活的方法,使用{}占位符。- f-Strings:Python 3.6+ 中现代、简洁且高度推荐的方法,允许将表达式直接嵌入到字符串中。
- 数字格式化:如何在 f-Strings 中使用格式说明符(format specifiers)来控制数字的呈现方式,包括分隔符、精度和百分比。
Template字符串:一种更简单、更安全的字符串替换机制,非常适合处理来自外部或不受信任来源的模板。
通过理解每种方法的优点和缺点,你现在可以为在 Python 编程旅程中遇到的任何字符串格式化任务选择最合适的工具。



