Python 中的模字符串格式化

2025年3月17日 | 阅读 14 分钟

在本教程中,我们将学习在 Python 中用于字符串格式化的模数运算符。

如果用户正在使用 Python 3 编写现代 Python 代码,他们将需要使用像 f-string 这样的 Python 字符串格式化工具来格式化他们的字符串。但是,如果他们正在处理旧的 Python 代码库,很可能会遇到使用字符串模数运算符来格式化字符串的情况。

如果用户正在编写或阅读 Python 2 代码,熟悉这种方法会很有帮助。由于该语法在 Python 3 中仍在使用,因此可能会发现开发者在最新的 Python 代码库中使用它。

在本教程中,我们将讨论如何:

  • 使用模数运算符 (%) 来格式化字符串。
  • 在将值合并到字符串之前,将它们转换为特定类型。
  • 我们必须指定一个格式化值所占用的垂直空间。
  • 使用转换标志调整显示外观。
  • 使用字典映射来指定值,而不是元组。

如果用户熟悉 C、Perl 以及 Java 中的 printf() 系列函数,他们会注意到这些在 Python 中是不可用的。但是,printf() 和字符串模数运算符之间有相当大的相似之处。如果用户已经熟悉使用 printf(),下面的许多函数将会很熟悉。

然而,如果您不熟悉 printf(),也不用担心!掌握 Python 中的模数字符串格式化不需要任何 printf() 的先前经验。

在 Python 中使用模数运算符进行字符串格式化

我们以前可能都听说过模数运算符 (%) 与数字一起使用,在这种情况下,它计算除法的余数。

示例

输出

1   

字符串操作数用于格式化字符串,但模数运算符执行不同的功能:字符串格式化。

这是字符串模数的语法

在 % 运算符的左侧是一个包含一个或多个转换说明符的字符串。在右侧,<values> 被插入到 <format_string> 中,以替换转换说明符。结果是查询的格式化字符串。

在这里,我们将首先演示如何使用 print() 通过字符串模数运算符显示格式化的字符串。

示例

输出

12 apples cost $3.44   

除了作为字符串模数运算本身的符号之外,该字符还表示格式字符串中转换说明符的开始。在这种情况下,有三个:%d、%s 和 %.2f。

在程序的输出中,Python 将元组中的每个项目转换为字符串,然后将其插入到格式字符串中,以代替相应的转换说明

  • 元组中的第一个元素是数字 12,一个替换字符串格式中字符 %d 的数值。
  • 下一个元素是字符串 "apples" 的值,它替代了 %s。
  • 最后一个是浮点数 3.44,它替代了 %.2f。

创建的字符串是“12 apples that cost $3.44”,如下图所示

Modulo String Formatting in Python

如果有多个值要添加到同一个元组中,它们应该包含在一个元组中,如上一个示例所示。如果只有一个值,我们可以单独写出它,而不需要用括号括起来。

示例

输出

Hello, my website name is JavaTpoint.   

另外,请注意,字符串模数运算不仅用于打印。我们也可以格式化值,然后将它们赋给另一个字符串变量。

示例

输出

Hello, my website name is JavaTpoint.   

如果用户熟悉 C 编程语言中与 printf() 相关的函数,他们可能会观察到上面模数字符串格式化的格式语法类似于 sprintf()。如果不熟悉,别担心!

转换说明符

转换说明符的各种组件包含在字符串格式中。它们决定了当 Python 插入字符串格式时值的格式。

转换说明符以百分号字符开始,并可能按特定顺序包含多个元素

百分号字符和 <type> 组件都是必需的。显示在括号中的其他组件并不重要。

下表总结了转换说明符各部分的功能

组件含义
%引入转换说明符
<flags>表示一个或多个对格式化进行更精细控制的标志
<width>指定格式化结果的最小宽度
.<precision>确定浮点数或字符串输出的长度和精度
<type>表示要执行的转换类型

使用转换类型转换值

转换说明符的最后一个元素,唯一的要求是它是唯一的部分,除了开头的 % 字符

这决定了 Python 在将其值输入格式字符串之前对其进行的转换类型。下表列出了可以使用的各种转换类型

<type>转换类型
d, i, u十进制整数
x, X十六进制整数
o八进制整数
f, F浮点数
e, EE 记数法
g, G浮点数或 E 记数法
c单个字符
s, r, aString
%单个 '%' 字符

在接下来的部分中,我们将学习如何使用这些转换类型。

整数转换类型

整数值对应于 d、i、u、x、Xo 转换类型。

d、i 和 u 的功能相同。这三种都将相应的参数转换为十进制整数的字符串表示形式。

示例

输出

'123, 123, 123'   

输出

'-123, -123, -123'    

我们可以选择让值为正或负。如果值为负,它将被替换为负号(-)。

xX 类型的转换会转换为表示十六进制数值的字符串。"o" 会转换为表示八进制整数值的字符串。

示例

输出

'd4, D4'   

输入

输出

'14'   

小写 x 将产生小写输出。大写 X 将产生大写输出。

我们可以使用转换标志对最终格式进行额外控制。

浮点数转换类型

转换类型 fF 创建浮点数的字符串表示形式。而 eE 则产生表示 E(科学)记数法的字符串。

示例

输出

'3.141590, 3.140000'    

输入

输出

'1.010000e+03, 1.010000E+02'    

小写的 fe 生成小写输出。大写的 F 和 E 创建大写输出。

gG 可以根据指数部分的大小和值选择浮点数或 E 记数法输出。

示例

输出

'4.12'    

输入

输出

'7e-08'  

输入

输出

'7E-08'   

如果指数小于 -4 或不小于精度,输出与 eE 相同。否则与 fF 相同。

与其他浮点数转换类型一样,g 产生小写输出,而 G 产生大写输出。

字符转换类型

c 转换类型插入一个字符。相应字符的值可以是一个整数或一个单字符字符串。

示例

输出

'{'  

输入

输出

'k'   

如果您提供一个整数,Python 会将其转换为可打印字符。此转换类型也支持转换为 Unicode 字符。

示例

输出

'∜'   

用户也可以使用 %c 并传递 ASCII 或 Unicode 的代码,以便在字符串中正确呈现格式化的字符。

转换类型 s、r 和 a 通过使用内置函数 str()、repr() 和 ascii() 产生字符串输出。

示例

输出

'Coffee ☕'  

输入

输出

"'Coffee ☕'"   

输入

输出

"'Coffee \\u2615\\ufe0f'"    

当用户在代码中使用 %a 时,Python 会将 Unicode 字符转换为它们的 ASCII 表示形式。

用户可以使用 <width> 和 .<precision> 转换说明符组件来控制字符串输出的填充和对齐方式,我们将在下一节中看到。

字面百分号 (%%)

我们可以通过在格式字符串中指定两个连续的百分号 (%%) 来在输出中插入一个百分号 (%)。格式字符串中的第一个字符引入一个转换说明符,而第二个字符 (%%) 指定转换类型将是 %。

这种格式化将在我们的输出中包含一个百分号字符(%)。

示例

输出

'We get 10% off on Apples today only!'   

此代码示例显示了两种转换类型

  1. 第一个 (%d) 是十进制整数转换类型。
  2. 第二个 (%%) 是一个字面百分号字符,呈现为 %。

请注意,%% 转换类型不需要任何 <values>,如字符串模数运算符右侧所示 (10, "Apples")。当我们需要在字符串中呈现一个字面百分号时,可以使用此转换类型来转义百分号字符。

使用宽度和精度水平对齐数据

它的 <width> 和 .<precision> 组件位于转换说明的中间

它们可以单独使用,也可以相互配合使用。它们通过改变字符串的填充或 Python 显示的所有值的长度来确定格式化值所占用的水平空间量。

The <width> Component

字段的最小尺寸使用 <width> 组件。当输出短于 <width> 时,默认情况下它在字段中右对齐,并在左侧用 ASCII 空格字符填充。

示例

输出

' foo'    

输入

输出

'   4'    

第一个字符串是 "foo",长度为三个字符。由于用户使用 4 作为转换说明元素的 <width>,Python 在包含 "foo" 之前添加了两个空格字符,以创建一个包含 4 个字符的字符串。

在第二种情况下,用户选择一位数 "4" 作为输入,并请求一个长度为 4 个字符的字符串。因此,Python 再次在插入表示数字 4 的字符串之前添加两个空格字符,以创建总长度为 4 个字符的最终字符串。

我们可以更改 Python 应该使用的填充字符。

如果输出的长度超过输入的长度,它没有任何效果。

示例

输出

'3241'   

输入

输出

'3241'    

输入

输出

'JavaTpoint'   

输入

输出

'JavaTpoint'  

在每个示例中,它都将字段宽度指定为 2。但是,由于我们要求 Python 写入的值大于两个字符,这导致的结果与我们根本不提供 <width> 时相同。

The .<precision> Component

.<precision> 转换说明符组件影响浮点数转换类型和字符转换类型。

对于浮点转换类型 f、F、e 和 E,它决定了小数点后的位数。

示例

输出

'213.74'   

输入

输出

'2.14e+02'   

对于浮点转换类型,我们可以使用 "g" 以及 "G" 来确定小数点前后有效数字的数量。

示例

输出

'2.1e+02'   

使用 s、r 和 a 字符转换类型格式化的字符串值会被缩短到 .<precision> 组件指定的长度。

示例

输出

'Java'   

在这种情况下,我们需要确定输入值 "JavaTpoint" 的长度是八个字符。但是,我们将 .<precision> 设置为 4。因此,Python 将只显示输入字符串的前四个字符。

用户可能会看到 <width> 和 .<precision> 也可以一起使用。

示例

输出

' 213.736'    

输入

输出

'     Jav'   

我们可以用星号字符(*)同时指定 <width> 和 .<precision> 作为占位符。如果我们这样做,Python 会从元组中的项中获取这些占位符的值。

示例

输出

'      141'    

输入

输出

'000000013'   

输入

输出

'     0141'  

如果我们的值是一个不变的值,那么我们不太可能需要使用这个功能。使用像上面例子中的占位符和直接使用值在功能上没有区别。

示例

输出

'        14'    

输入

输出

'0000000014'  

输入

输出

'     00014' 

当我们用变量定义宽度或精度时,使用占位符星号可能更具吸引力。

示例

输出

Enter width:  4
[ ABC]
Enter width:  2
[ABC]
Enter width:  7
[    ABC]    

此语法可以在执行时设置宽度和精度,这意味着它们可能每次运行都不同。

使用转换标志微调输出

我们还可以在字符:% 字符之间指定转换标志

它们让我们能够更具体地改变特定类型转换的显示。<flag> 组件转换说明符可以包含下表中列出的一个或多个字母

Character控制
#浮点数和整数值的小数点或基数点的显示
0小于指定字段宽度的值的填充
-小于指定字段宽度的字段的验证
+数值的前导符号的显示
' ' (space)数字的前导符号的显示

井号标志 (#)

# 标志允许在十六进制和八进制转换类型的格式化输出中显示基数信息。对于使用 o 转换类型的,此标志将添加前导 "0o"。对于使用 "x" 和 "X" 转换类型的,此标志将添加前导 "0x" 或 "0X"。

示例

输出

'0o14'   

输入

输出

('0xc', '0XC')    

对于十进制转换类型,# 标志被忽略。当使用十进制转换器类型如 d、i 和 u 时,# 标志不适用。

井号标志导致输出包含浮点值的小数点。通常,如果小数点后没有数字,浮点值不会有小数点。此标志是必需的,以包含小数点的添加。

示例

输出

'412'    

输入

输出

'412.'   

输入

输出

'4e+02'  

输入

输出

'4.e+02'  

使用 # 标志包含小数点的要求。井号标志也可以用于显示使用 E 记数法的值。这在代码示例中得到了演示。

零标志 (0)

如果格式化的数值小于字段大小的维度,标准行为是用 ASCII 空格在数字的右侧填充字段。标志 0 选项会导致用 "0" 字符进行填充。

示例

输出

'0234'    

输入

输出

'00003.20'   

0 标志可用于所有类型的数字转换:d、i、u、x、X、o、f、F、e、E、g 和 G。

连字符-减号标志 (-)

如果格式化的值小于指定的字段宽度,它通常在字段内右对齐。在这种情况下,连字符 (-) 标志将使值在字段内左对齐。

示例

输出

'234  '   

输入

输出

'234.30  '  

输入

输出

'ABC      ' 

您可以使用标志 (-) 来指定三种字符串转换类型:s、a 和 r,以及任何其他类型的数值转换。如果类型是数值型,并且同时出现零和字符 '-',则 0 不被考虑。

加号标志 (+)

默认情况下,所有正数值都不包括前导符号字符。此外,(+) 标志在数值输出的左侧添加一个加号 (+)。

示例

输出

'+4'   

输入

输出

'   +4'    

输入

输出

'    4'    

如果我们比较这两个输出,可以看到 Python 在计算输出宽度时,会考虑我们使用此标志添加的 + 字符。

此标志不受负数值的影响,负数值通常包含前导减号 (-)。与加号类似,Python 在计算输出大小时也会考虑加号字符。

空格字符标志 (' ')

空格字符标志 (' ') 在正数值前面添加一个额外的空格字符

输出

' 4'   

与那个标志一样,它不影响负数值,负数值总是伴随着一个潜在的零字符 (-)。

示例

输出

' 4'   

输入

输出

'-3'  

输入

输出

'-3'  

使用 + 标志或空格标志中的任何一个,都将帮助我们一致地对齐正数和负数。

通过字典映射指定值

我们可以将插入到字符串格式中的格式字符串定义为字典而不是元组。在这种情况下,每个转换说明符必须在 "%" 字符后立即在括号内包含任何与字典相关的键。

示例

输出

'4 apples cost $3.74'   

输入

输出

'4 apples cost $3.74'    

通过这种方法,我们可以按任意顺序定义要插入的值

输出

'4 apples cost $3.74'    

输入

输出

"You'll pay $3.74 for apples, if you buy 4"    

下面列出的转换说明符组件——<flags>、<width> 和 .<precision>——仍然像我们使用元组输入值时一样工作。我们可以使用它们中的任何一个来定义字典

输出

'Quantity: 004'   

输入

输出

'Item:     apple'   

在上面的代码片段示例中,我们在第一个示例中使用了 0 标志,在第二个示例中使用了估计值 5。

使用字典映射定义输入值对于那些希望只指定一次输入值,然后为不同输出更改其显示顺序的用户特别有用。

结论

我们对字符串模数运算符有了很好的理解。这是一种在 Python 中使用的较旧的格式化技术。由于这种技术仍然有效,并且在 Python 2 中被广泛使用,因此熟悉这种特定语法的基本知识是很有帮助的。

在本课程中,我们学习了如何:

  • 使用模数运算符 (%) 来格式化字符串。字符串的格式化
  • 在插入我们的字符串之前将值转换为特定类型
  • 指示格式化值所占用的水平区域
  • 使用转换标志调整显示外观
  • 使用字典映射来指定值,而不是元组。