Python 字符串格式化

PythonBeginner
立即练习

介绍

欢迎来到 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 编程旅程中遇到的任何字符串格式化任务选择最合适的工具。