如何在Python3中使用字符串格式化程序

来自菜鸟教程
跳转至:导航、​搜索

###介绍

Python 的 string 类的 str.format() 方法允许您进行 变量 替换和值格式化。 这使您可以通过位置格式将字符串中的 元素连接在一起

本教程将指导您了解 Python 中格式化程序的一些常见用法,这有助于使您的代码和程序更具可读性和用户友好性。

先决条件

您应该在您的计算机或服务器上安装 Python 3 并设置编程环境。 如果您没有设置编程环境,您可以参考本地编程环境或服务器上的编程环境适合您的操作的安装和设置指南系统(Ubuntu、CentOS、Debian 等)

    1. 使用格式化程序

格式化程序通过将一个或多个 替换字段 或占位符(由一对花括号 {} 定义)放入字符串并调用 str.format() 方法来工作。 您将要与字符串连接的值传递给方法。 当您运行程序时,该值将在您的占位符所在的位置传递。

让我们打印出一个使用格式化程序的字符串:

Info: 要跟随本教程中的示例代码,请通过运行 python3 命令在本地系统上打开 Python 交互式 shell。 然后,您可以通过在 >>> 提示符后添加示例来复制、粘贴或编辑示例。


print("Sammy has {} balloons.".format(5))
OutputSammy has 5 balloons.

在上面的例子中,我们用一对花括号作为占位符构造了一个字符串:

"Sammy has {} balloons."

然后我们添加了 str.format() 方法并将整数 5 的值传递给该方法。 这会将 5 的值放入花括号所在的字符串中:

Sammy has 5 balloons.

我们还可以将变量分配为等于具有格式化程序占位符的字符串的值:

open_string = "Sammy loves {}."
print(open_string.format("open source"))
OutputSammy loves open source.

在第二个示例中,我们将字符串 "open source" 与较大的字符串连接,替换原始字符串中的花括号。

Python 中的格式化程序允许您使用花括号作为将通过 str.format() 方法传递的值的占位符。

    1. 使用带有多个占位符的格式化程序

使用格式化程序时,您可以使用多对花括号。 如果我们想在上面的句子中添加另一个变量替换,我们可以通过添加第二对花括号并将第二个值传递给方法来实现:

new_open_string = "Sammy loves {} {}."                      #2 {} placeholders
print(new_open_string.format("open-source", "software"))    #Pass 2 strings into method, separated by a comma
OutputSammy loves open-source software.

为了添加另一个替换,我们在原始字符串中添加了第二对花括号。 然后,我们将两个字符串传递给 str.format() 方法,用逗号分隔它们。

按照相同的语法,我们可以添加额外的替换:

sammy_string = "Sammy loves {} {}, and has {} {}."                      #4 {} placeholders
print(sammy_string.format("open-source", "software", 5, "balloons"))    #Pass 4 strings into method
OutputSammy loves open-source software, and has 5 balloons.

sammy_string 中,我们添加了 4 对花括号作为变量替换的占位符。 然后我们将 4 个值传递给 str.format() 方法,混合字符串和整数数据类型。 这些值中的每一个都由逗号分隔。

    1. 使用位置和关键字参数重新排序格式化程序

当我们将大括号留空而没有任何参数时,Python 会按顺序替换通过 str.format() 方法传递的值。 正如我们所看到的,到目前为止,带有两个空花括号和两个值的格式化程序构造将如下所示:

print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
OutputSammy the shark has a pet pilot fish!

第一对花括号被替换为 "shark" 的字符串值,第二对花括号被替换为 "pilot fish" 的字符串值。

方法中存在的值如下所示:

("shark", "pilot fish")

它们本质上是 元组数据类型 ,元组中包含的每个单独的值都可以通过其索引号调用,该索引号从索引号 0 开始。

我们可以将这些索引号传递到用作原始字符串中占位符的花括号中:

print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))

在上面的示例中,输出将是我们在不将索引号传递到大括号的情况下得到的结果,因为我们按顺序调用元组中的值:

OutputSammy the shark has a pet pilot fish!

但是,如果我们使用占位符的参数反转索引号,我们可以反转传递到字符串中的值:

print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
OutputSammy the pilot fish has a pet shark!

如果您在索引位置 0 和 1 处具有值的元组中调用索引号 2,那么您调用的值超出了范围。 当您调用超出范围的索引号时,您将收到一条错误消息:

print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
OutputIndexError: tuple index out of range

我们看到的错误消息是指元组仅在索引号 0 和 1 处具有值,因此将索引号 2 置于范围之外。

让我们添加更多的占位符和更多的值来传递给它们,这样我们就可以理解如何更好地重新排序格式化程序。 首先,这是一个带有四个占位符的新字符串:

print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
OutputSammy is a happy, smiling and blue shark!

如果没有参数,传入 str.format() 方法的值会按顺序连接到字符串中。

元组中包含的字符串值对应于以下索引号:

“快乐的” “微笑” “蓝色的” “鲨鱼”
0 1 2 3

让我们使用值的索引号来更改它们在字符串中出现的顺序:

print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
OutputSammy is a shark, blue, and smiling happy!

由于我们从索引号 3 开始,我们首先调用 "shark" 的最后一个值。 作为参数包含的其他索引号会更改单词在原始字符串中的显示顺序。

除了位置参数,我们还可以引入由关键字名称调用的关键字参数:

print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
OutputSammy the shark made a pull request.

此示例显示了与位置参数一起使用的关键字参数的使用。 我们可以在位置参数旁边填写关键字参数 pr,并且可以移动这些参数以更改结果字符串:

print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
OutputSammy the pull request made a shark.

与字符串格式化程序一起使用的位置和关键字参数使我们能够更好地控制通过重新排序来操作原始字符串。

    1. 指定类型

我们可以在语法的花括号中包含更多参数。 我们将使用格式代码语法 {field_name:conversion},其中 field_name 指定 str.format() 方法的参数的索引号,我们在 重新排序部分 [ X177X] 和 conversion 是指您与格式化程序一起使用的数据类型的转换代码。

转换类型是指 Python 使用的单字符类型代码。 我们将在此处使用的代码是 s 用于字符串,d 用于显示十进制整数(10 基),以及 f 用于显示浮点数带小数位。 您可以通过 Python 3 的官方文档了解更多关于 Format-Specification Mini-Language 的信息。

让我们看一个示例,其中我们通过方法传递了一个整数,但希望通过添加 f 转换类型参数将其显示为浮点数:

print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
OutputSammy ate 75.000000 percent of a pizza!

我们对第一个花括号替换字段使用 {field_name:conversion} 的语法来输出浮点数。 第二个花括号仅使用第一个参数 {field_name}

在上面的示例中,小数点后显示了很多数字,但您可以限制这些数字。 当您为浮点值指定 f 时,您可以通过包含句点 . 后跟您想要包含的小数点后的位数来额外指定该值的精度。

如果 Sammy 吃了 75.765367% of 个披萨,但我们不需要很高的准确度,我们可以通过在转换类型 f

print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
OutputSammy ate 75.765 percent of a pizza!

如果我们只想要一位小数,我们可以像这样重写字符串和方法:

print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
OutputSammy ate 75.8 percent of a pizza!

请注意,修改精度将导致数字被四舍五入。

虽然我们将没有小数位的数字显示为浮点数,但如果我们尝试使用 d 转换类型将浮点数更改为整数,我们将收到错误:

print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
OutputValueError: Unknown format code 'd' for object of type 'float'

如果您不希望显示小数位,您可以像这样编写格式化程序:

print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
OutputSammy ate 76 percent of a pizza!

这不会 将您的浮点数转换为整数 ,而是限制小数点后显示的位数。

    1. Padding 变量替换

因为占位符是替换字段,您可以 pad 或通过附加参数增加字段大小来在元素周围创建空间。 当我们需要直观地组织大量数据时,这可能很有用。

我们可以在语法的花括号中的冒号 : 之后添加一个数字来指示字段大小(以字符为单位):

print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
OutputSammy has    5 red balloons        !

在上面的例子中,我们给数字 5 的字符域大小为 4,字符串 balloons 的字符域大小为 16(因为它是一个长字符串)。

正如我们所见,默认情况下,字符串在字段内是左对齐的,而数字是右对齐的。 您可以通过在冒号后面放置对齐代码来修改它。 < 将使字段中的文本左对齐,^ 将使字段中的文本居中,> 将其右对齐。

让我们左对齐数字并使字符串居中:

print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
OutputSammy has 5    red     balloons    !

现在我们看到 5 是左对齐的,在 red 之前的字段中提供了空间,而 balloons 在其字段中居中,并且在其左右两侧都有空间。

默认情况下,当我们使用格式化程序使字段变大时,Python 将用空白字符填充该字段。 我们可以通过指定我们希望它直接跟在冒号后面的字符来将其修改为不同的字符:

print("{:*^20s}".format("Sammy"))
Output*******Sammy********

我们接受在索引位置 0 处传递给 str.format() 的字符串,因为我们没有另外指定,包括冒号,并指定我们将使用 * 而不是空格来填充场地。 我们用 ^ 使字符串居中,指定字段大小为 20 个字符,并通过包含 s 指示我们正在使用字符串转换类型。

我们可以将这些参数与我们之前使用过的其他参数结合起来:

print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
OutputSammy ate    76 percent of a pizza!

在大括号内的参数中,我们指定了浮点数的索引字段号并包含冒号,表示字段号的大小并包含句号,写在小数位后的位数,然后指定f的转换类型。

    1. 使用变量

到目前为止,我们已经将整数、浮点数和字符串传递到 str.format() 方法中,但我们也可以通过该方法传递变量。 这与任何其他变量一样工作。

nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
OutputSammy has 8 balloons today!

我们可以为原始字符串和传递给方法的内容使用变量:

sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
OutputSammy has 8 balloons today!

变量可以很容易地替换我们格式化程序语法构造的每个部分。 当我们接受用户生成的输入并将这些值分配给变量时,这使得使用起来更容易。

    1. 使用格式化程序来组织数据

当格式化程序用于以可视方式组织大量数据时,可以以最佳方式看到它们。 如果我们向用户展示数据库,使用格式化程序来增加字段大小和修改对齐方式可以使您的输出更具可读性。

让我们看一下 Python 中的典型 for 循环 ,它将打印出 3 到 12 范围内的 ii*ii*i*i

for i in range(3,13):
    print(i, i*i, i*i*i)
Output3 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 个字符空间,因此我们的输出如下所示:

Output  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))
Output     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添加小数位,更改字段名称索引号等,以确保我们按照我们的意愿显示数据。

##结论

使用格式化程序进行变量替换可能是连接字符串和组织值和数据的有效方法。 格式化程序代表了将变量替换传递到字符串中的一种基本但非描述性的方式,并且对于确保输出可读和用户友好很有用。