如何在 Python 3 中使用字符串格式化器

介绍

Python 的 [str.format()] 类方法(https://www.digitalocean.com/community/tutorial_series/working-with-strings-in-python-3)允许你进行 变量的替代和值格式化。

本教程将引导您通过Python中一些常见的格式化用途,这可以帮助使您的代码和程序更易于阅读和用户友好。

前提条件

如果您没有设置编程环境,您可以参考本地编程环境的安装和安装指南(https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-python-3)或适用于您的操作系统(Ubuntu, CentOS, Debian 等)的编程环境(https://www.digitalocean.com/community/tutorial_collections/how-to-install-python-3-and-set-up-a-programming-environment)。

使用格式

格式化器通过将一个或多个 置换字段或位置保持者 - 由一对弯曲的轴承 {} 定义 - 插入一个字符串并调用 `str.format() 方法。

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

<$>[info] Info: 要跟进本教程中的示例代码,请在本地系统上运行python3命令,打开Python互动壳。

1print("Sammy has {} balloons.".format(5))
1[secondary_label Output]
2Sammy has 5 balloons.

在上面的示例中,我们构建了一根带有两对弯曲的轴承作为一个位置:

1"Sammy has {} balloons."

然后我们添加了str.format()方法,并将整数5的值传递到该方法中,这将5的值放入曲线的字符串中:

1Sammy has 5 balloons.

我们还可以分配一个变量等于具有格式定位符的字符串的值:

1open_string = "Sammy loves {}."
2print(open_string.format("open source"))
1[secondary_label Output]
2Sammy loves open source.

在这个第二个例子中,我们将字符串开源与较大的字符串交织在一起,取代原始字符串中的弯曲字符串。

在Python中,Formatters允许您使用弯曲的轴承作为您将通过str.format()方法的值的位置持有者。

使用与多个位置持有人的格式化

如果我们想添加另一个变量替换到上面的句子,我们可以通过添加第二对弯曲的杠杆,并将第二个值传入方法:

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

为了添加另一个替代,我们在原始字符串中添加了第二对弯曲的字符串,然后我们将两个字符串传入 str.format() 方法,将它们分开一个字符串。

按照相同的语法,我们可以添加其他替代:

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

在「sammy_string」中,我们添加了 4 对弯曲的字符串作为变量替代的位置持有者,然后将 4 个值传入「str.format()」方法,混合字符串和整数数据类型。

用位置和关键字参数重新排序格式

当我们在没有任何参数的情况下留下弯曲的轴承时,Python将取代通过str.format()方法传递的值,正如我们所看到的那样,迄今为止,一个带有两种传递的值的弯曲的轴承的格式化结构将看起来像这样:

1print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
1[secondary_label Output]
2Sammy the shark has a pet pilot fish!

第一对弯曲的轴承被替换为鲨鱼的字符串值,第二对被替换为飞行鱼的字符串值。

方法中存在的值看起来如下:

1("shark", "pilot fish")

它们基本上是 双重数据类型,并可以通过其索引号调用每一个单个值,该索引号从索引号 0 开始。

我们可以将这些索引数字传递到作为原始字符串的位置保持者的弯曲的轴承中:

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

在上面的示例中,输出将是我们得到的,而不将索引数字传入轴承中,因为我们按顺序调用轴承中的值:

1[secondary_label Output]
2Sammy the shark has a pet pilot fish!

但是,如果我们用位置持有者的参数扭转索引数字,我们可以扭转传入字符串的值:

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

如果您在指数位置 0 和 1 的数组中调用 2 的索引号,则您正在调用处于范围外的值。

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

我们看到的错误消息指的是,tuple仅在索引数字0和1上有值,因此将索引数字2置于范围之外。

让我们添加一些更多的位置持有者和一些更多的值来传递给他们,这样我们就可以理解如何更好地重新排序格式。

1print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
1[secondary_label Output]
2Sammy is a happy, smiling and blue shark!

没有参数,将传入 `str.format() 方法的值以顺序连接到字符串中。

tuple 中包含的字符串值与以下索引数字相符:

"happy""smiling""blue""shark"
0123

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

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

由于我们从索引数字3开始,我们首先称为鲨鱼的最后一个值。

除了位置参数外,我们还可以引入以其关键字名称命名的关键字参数:

1print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
1[secondary_label Output]
2Sammy the shark made a pull request.

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

1print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
1[secondary_label Output]
2Sammy the pull request made a shark.

与字符串格式器使用的位置和关键字参数为我们提供了通过重新排序来操纵原始字符串的更多控制权。

定义类型

我们将使用格式代码语法 {field_name:conversion},在那里 field_name 指定了参数的索引号为我们在 重新排序部分中所使用的 str.format() 方法,而 conversion 指的是与格式器一起使用的数据类型的转换代码。

转换类型是指Python所使用的单字符类型代码。我们在这里使用的代码是s用于字符串,d用于显示十进制整数(10 个基数),以及f用于显示十进制位置的浮点。

让我们看看一个例子,我们有一个通过该方法的整数,但要通过添加f转换类型参数来显示它作为浮动:

1print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
1[secondary_label Output]
2Sammy ate 75.000000 percent of a pizza!

我們使用了「{field_name:conversion}」的語法,以便在第一個 curly brace 替換領域中輸出一個 float. 第二個 curly braces 只使用第一個參數「{field_name}」。

在上面的示例中,有许多数字显示在十进制点之后,但您可以限制这些数字。当您指定f为浮动值时,您还可以通过包括一个完整的止步来指定该值的准确性。

如果 Sammy 吃了 75.765367% 的披萨,但我们不需要高精度,我们可以通过在转换类型f之前添加.3来限制十进制后的位置为 3:

1print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
1[secondary_label Output]
2Sammy ate 75.765 percent of a pizza!

如果我们只想要一个十进制位置,我们可以这样重写字符串和方法:

1print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
1[secondary_label Output]
2Sammy ate 75.8 percent of a pizza!

请注意,修改精度会导致数字圆形。

虽然我们将没有十进制位置的数字显示为浮点,但如果通过使用d转换类型来改变浮点为整数,我们会收到一个错误:

1print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
1[secondary_label Output]
2ValueError: Unknown format code 'd' for object of type 'float'

如果您不想显示任何十进制位置,您可以这样编写您的格式:

1print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
1[secondary_label Output]
2Sammy ate 76 percent of a pizza!

这将不会 将你的浮点转换为整数,而是限制在十进制点后显示的位置数量。

替换变量

由于位置持有者是替换字段,您可以 pad 或通过通过额外参数增加字段大小来创建元素周围的空间。

我们可以添加一个数字来表示字符大小(从字符的角度来讲)在我们语法的弯曲框中:之后:

1print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
1[secondary_label Output]
2Sammy has 5 red balloons        !

在上面的示例中,我们给了数字5一个字符字段大小为4,而字符串气球一个字符字段大小为16(因为它是一个长的字符串)。

正如我们所看到的,默认情况下,字符串在字段中是左对应的,而数字是右对应的。你可以通过在字符串后放置一个对应代码来修改这一点。 < 将左对应字段中的文本, ^ 将中心字段中的文本,而 > 将右对应它。

让我们将数字对齐到左边,并将字符串中心:

1print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
1[secondary_label Output]
2Sammy has 5 red balloons    !

现在我们看到‘5’是左对齐的,在‘红色’之前提供空间,而‘气球’则是中心的,它的左边和右边有空间。

默认情况下,当我们使用格式化器使一个字段更大时,Python 会用白空间字符填充该字段,我们可以通过指定我们想要的字符直接跟随字符串来修改该字符为不同的字符:

1print("{:*^20s}".format("Sammy"))
1[secondary_label Output]
2*******Sammy********

我们正在接受将字符串转移到str.format()在0的索引位置,因为我们没有指定其他方式,包括列,并指定我们将使用*而不是空间来填充字段,我们正在以^来中心字符串,指定字段大小为20个字符,并表示我们正在通过包括s来工作。

我们可以将这些参数与我们以前使用的其他参数相结合:

1print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
1[secondary_label Output]
2Sammy ate 76 percent of a pizza!

在弯曲轴内的参数中,我们指定了浮点的索引字段号,并包括了结肠,表示了字段号的大小,并包括了完整停机,在十进制位置后写入位置数量,然后指定了f的转换类型。

使用变量

到目前为止,我们已经将整数、浮点和字符串传入str.format()方法,但我们也可以通过该方法传输变量。

1nBalloons = 8
2print("Sammy has {} balloons today!".format(nBalloons))
1[secondary_label Output]
2Sammy has 8 balloons today!

我们可以使用原始字符串和传入方法的变量:

1sammy = "Sammy has {} balloons today!"
2nBalloons = 8
3print(sammy.format(nBalloons))
1[secondary_label Output]
2Sammy has 8 balloons today!

变量可以很容易地替代我们的格式设计语法构造的每个部分,这使得我们在使用用户生成的输入并将这些值分配给变量时更容易工作。

使用格式化器来组织数据

如果我们向用户展示数据库,则使用格式化器来增加字段大小并修改对齐可以使输出更易读。

让我们看看Python中的典型(为循环)(https://andsky.com/tech/tutorials/how-to-construct-for-loops-in-python-3),在3到12的范围内打印i,i*ii*i*i:

1for i in range(3,13):
2    print(i, i*i, i*i*i)
 1[secondary_label Output]
 23 9 27
 34 16 64
 45 25 125
 56 36 216
 67 49 343
 78 64 512
 89 81 729
 910 100 1000
1011 121 1331
1112 144 1728

虽然输出是以某种方式组织的,但数字过度涌入对方的列,使输出的底部更不易读。

让我们使用格式化器来给这些数字更多的空间:

1for i in range(3,13):
2    print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))

在这里,我们没有为索引号添加字段名称,然后开始使用结块,然后是字段大小的数字,然后是d转换类型,因为我们正在使用整数。

 1[secondary_label Output]
 2  3 9 27
 3  4 16 64
 4  5 25 125
 5  6 36 216
 6  7 49 343
 7  8 64 512
 8  9 81 729
 9 10 100 1000
10 11 121 1331
11 12 144 1728

我们可以指定一个一致的字段大小号码,以便有均匀的列,以确保我们可以容纳较大的数字:

1for i in range(3,13):
2    print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
 1[secondary_label Output]
 2     3 9 27
 3     4 16 64
 4     5 25 125
 5     6 36 216
 6     7 49 343
 7     8 64 512
 8     9 81 729
 9    10 100 1000
10    11 121 1331
11    12 144 1728

我们还可以通过添加<,^>来操纵列的对齐来对比文本对齐,更改df来添加十进制点,更改字段名称索引号码,等等,以确保我们按我们想要的方式显示数据。

结论

使用变量替代的格式器可以是连接字符串、组织值和数据的有效方法. 格式器是将变量替代传递到字符串的基本但非描述的方式,有助于确保输出是可读和用户友好的。

Published At
Categories with 技术
comments powered by Disqus