介绍
Python的str.format()
方法是 string
类的一部分,它允许您进行变量替换和值格式化。这使您能够通过位置格式化在字符串中连接元素。
本教程将指导您了解Python中格式化程序的一些常见用法,这可以使您的代码和程序更具可读性和用户友好性。
使用格式化程序
格式化程序通过在字符串中插入一个或多个替换字段或占位符(由一对花括号 {}
定义)并调用str.format()
方法来工作。您将向该方法传递您想要与字符串连接的值。当运行程序时,该值将在与占位符相同位置传递。
让我们打印一个使用格式化程序的字符串:
print("Sammy has {} balloons.".format(5))
Sammy has 5 balloons.
在上面的例子中,我们构建了一个带有一对花括号的字符串作为占位符:
"Sammy has {} balloons."
然后,我们添加了str.format()
方法并将整数5
的值传递给该方法。这将在原始字符串中的花括号位置放置值5
:
Sammy has 5 balloons.
我们还可以将变量赋值为等于具有格式化程序占位符值的字符串:
open_string = "Sammy loves {}."
print(open_string.format("open source"))
Sammy loves open source.
在第二个例子中,我们将字符串"open source"
与较大的字符串连接起来,替换原始字符串中的花括号。
Python中的格式化程序允许您使用花括号作为str.format()
方法中将传递的值的占位符。
使用具有多个占位符的格式化程序
在使用格式化程序时,您可以使用多对花括号。如果我们想要在上面的句子中添加另一个变量替代,可以通过添加第二对花括号并将第二个值传递到方法中来实现:
new_open_string = "Sammy loves {} {}." #2 {} placeholders
print(new_open_string.format("open-source", "software")) #通过逗号分隔,将2个字符串传递到方法中
Sammy loves open-source software.
为了添加另一个替代,我们在原始字符串中添加了第二对花括号。然后,我们通过逗号分隔地传递了两个字符串到str.format()
方法中。
按照相同的语法,我们可以添加额外的替代:
sammy_string = "Sammy loves {} {}, and has {} {}." #4 {} placeholders
print(sammy_string.format("open-source", "software", 5, "balloons")) #通过逗号分隔,将4个字符串传递到方法中
Sammy loves open-source software, and has 5 balloons.
在sammy_string
中,我们添加了4对花括号作为变量替代的占位符。然后,我们通过逗号分隔,将4个值传递到str.format()
方法中,混合了字符串和整数数据类型。这些值之间由逗号分隔。
使用位置和关键字参数重新排序格式化程序
当我们在花括号中留空没有任何参数时,Python将按顺序替换通过str.format()
方法传递的值。正如我们到目前为止所看到的,一个具有两个空花括号的格式构造,其中传递了两个值的方法如下:
print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
Sammy the shark has a pet pilot fish!
第一对花括号由字符串值"shark"
替换,第二对由字符串值"pilot fish"
替换。
存在于方法内的值如下所示:
("shark", "pilot fish")
它们本质上是 tuple
数据类型,元组中包含的每个值都可以通过其索引号进行调用,索引号从0开始。
我们可以将这些索引号传递到原始字符串中作为占位符的花括号中:
print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))
在上面的例子中,输出将与我们不传递索引号到花括号中时得到的输出相同:
Sammy the shark has a pet pilot fish!
但是,如果我们反转用于占位符的参数的索引号,我们可以反转传递到字符串中的值:
print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Sammy the pilot fish has a pet shark!
如果在元组中有索引位置0和1的值,并调用索引位置2,则会发生错误。当调用超出范围的索引号时,将收到错误消息:
print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
IndexError: tuple index out of range
我们看到的错误消息是指元组只在索引号0和1处具有值,因此将索引号2放在范围之外。
让我们添加一些额外的占位符和一些额外的要传递的值,以便更好地理解我们如何重新排序格式化程序。首先,这是一个具有四个占位符的新字符串:
print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Sammy is a happy, smiling and blue shark!
没有参数的情况下,传递给str.format()
方法的值按顺序连接到字符串中。
元组中包含的字符串值对应于以下索引号:
“happy” | “smiling” | “blue” | “shark” |
---|---|---|---|
0 | 1 | 2 | 3 |
让我们使用值的索引号来更改它们在字符串中出现的顺序:
print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Sammy is a shark, blue, and smiling happy!
由于我们从索引号3开始,我们首先调用了值为"shark"
的最后一个值。包含为占位符指定的其他索引号的参数会更改原始字符串中单词出现的顺序。
除了位置参数外,我们还可以引入通过其关键字名称调用的关键字参数:
print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr="pull request"))
Sammy the shark made a pull request.
此示例显示了在位置参数与关键字参数一起使用关键字参数的用法。我们可以在关键字参数pr
旁边填充关键字参数,并可以移动这些参数以更改生成的字符串:
print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr="pull request"))
Sammy the pull request made a shark.
与字符串格式化程序一起使用的位置和关键字参数使我们能够通过重新排序来更好地操作原始字符串。
指定类型
我们可以在语法的花括号内包含更多的参数。我们将使用格式代码语法{field_name:conversion}
,其中field_name
指定我们在重新排序部分中讨论过的str.format()
方法的参数的索引号,conversion
是您在与格式化程序一起使用的数据类型的转换代码。
转换类型指的是Python使用的单字符类型代码。我们将在此处使用的代码有s
表示字符串,d
表示显示十进制整数(10进制),以及我们将使用的f
表示带小数点的浮点数。您可以通过Python 3的官方文档阅读有关格式规范微语言的更多信息。
让我们看一个例子,其中有一个整数通过该方法传递,但我们希望它以浮点数的形式显示,通过添加f
转换类型参数:
print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Sammy ate 75.000000 percent of a pizza!
我们使用了{field_name:conversion}
的语法,用于第一个花括号替换字段以输出浮点数。第二个花括号仅使用第一个参数{field_name}
。
在上面的例子中,小数点后显示了很多数字,但是您可以将这些数字限制为较少的数字。当指定f
以显示浮点数值时,可以通过在转换类型f
之前包含一个完整停止符.
,后跟您要包含的小数点后的数字来指定该值的精度。
如果 Sammy
吃了 75.765367%
的披萨,但我们不需要高精度,我们可以通过在转换类型f
之前添加.3
来将小数点后的位数限制为3:
print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Sammy ate 75.765 percent of a pizza!
如果我们只想要一个小数位数,我们可以像这样重写字符串和方法:
print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Sammy ate 75.8 percent of a pizza!
请注意,修改精度会导致数字四舍五入。
虽然我们将数字显示为不带小数点的浮点数,但如果我们尝试使用d
转换类型将浮点数更改为整数,则会收到错误:
print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
ValueError: Unknown format code 'd' for object of type 'float'
如果您不希望显示小数点后的位数,可以像这样编写您的格式化程序:
print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
上述示例将浮点数更改为整数,而不是将浮点数转换为整数,但会限制小数点后的位数。
填充变量替换
由于占位符是替换字段,因此可以通过在附加参数后通过增加字段大小来填充或在元素周围创建空间。当我们需要在视觉上组织大量数据时,这可能非常有用。
我们可以在冒号:
后在我们的语法的花括号中添加数字来指示字段大小(以字符为单位):
print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Sammy has 5 red balloons !
在上面的例子中,我们为数字5
指定了一个字符字段大小为4,并为字符串balloons
指定了一个字符字段大小为16(因为它是一个很长的字符串)。
正如我们所看到的,默认情况下,字符串在字段内左对齐,而数字在字段内右对齐。您可以通过在冒号后添加一个对齐代码来修改此设置。<
将在字段中左对齐文本,^
将文本居中在字段中,>
将文本右对齐。
让我们将数字左对齐并将字符串居中:
print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Sammy has 5 red balloons !
现在我们看到5
是左对齐的,提供了在red
之前的字段中的空间,balloons
在其字段中居中,其左右都有空间。
默认情况下,使用格式程序扩大字段时,Python将字段填充为空格字符。我们可以通过在冒号后直接跟随一个字符来修改为不同的字符:
print("{:*^20s}".format("Sammy"))
*******Sammy********
我们正在接受传递给str.format()
的字符串在索引位置0处,因为我们没有指定其他参数,包括冒号,并指定我们将使用*
而不是空格来填充字段。我们正在使用^
居中字符串,指定字段的大小为20,并且还指示我们正在处理字符串转换类型,通过包含s
。
我们可以将这些参数与我们之前使用过的其他参数结合使用:
print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
在花括号内的参数中,我们指定了浮点数的索引字段号,并包含了冒号,指定字段大小的数字,加上小数点,写入小数点后的位数,然后指定转换类型为f
。
使用变量
到目前为止,我们已经将整数,浮点数和字符串传递到str.format()
方法,但是我们也可以传递变量。这与任何其他变量一样。
nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Sammy has 8 balloons today!
我们可以为原始字符串和传递到方法中的内容使用变量:
sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Sammy has 8 balloons today!
变量可以轻松替代我们的格式化程序语法结构的每个部分。这使得在接受用户生成的输入并将这些值分配给变量时更容易处理。
使用格式化程序组织数据
当使用格式化程序来进行变量替换时,可以有效地对字符串进行连接和组织值和数据。格式化程序在将字符串连接在一起的同时提供了一种基本但非描述性的方式,并且在确保输出可读且用户友好时非常有用。
让我们看一下Python中的一个典型的for循环,它将在3到12范围内打印出i
,i*i
和i*i*i
:
for i in range(3, 13):
print(i, i * i, i * i * i)
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
虽然输出在某种程度上是有组织的,但数字会溢出到彼此的列中,使底部的输出不太可读。如果您正在处理具有许多小数和大数字的更大数据集,这可能会带来问题。
让我们使用格式化程序来为这些数字提供更多的空间:
for i in range(3, 13):
print("{:3d} {:4d} {:5d}".format(i, i * i, i * i * i))
在这里,我们在花括号中没有添加索引号的字段名,并且从冒号开始,后跟字段大小的数字和一个d
转换类型,因为我们正在处理整数。在此示例中,我们为每个预期输出的大小提供了2个额外的字符空间,具体取决于可能的最大数字大小,因此我们的输出如下:
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
我们可以指定一个一致的字段大小数字,以确保有均匀的列,确保我们适应更大的数字:
for i in range(3, 13):
print("{:6d} {:6d} {:6d}".format(i, i * i, i * i * i))
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
我们还可以通过在冒号后添加<
,^
和>
进行文本对齐,将d
更改为f
以添加小数点,更改字段名索引号,以确保我们按预期显示数据。
结论
使用格式化程序进行变量替换可以是连接字符串和组织值和数据的有效方法。格式化程序以一种基本但非描述性的方式表示将变量替换到字符串中的过程,并且在确保输出可读且用户友好时非常有用。