Python中的模运算字符串格式化
在本教程中,我们将学习Python中的模运算符进行字符串格式化。
如果用户正在使用Python 3编写当代Python代码,他们需要使用Python字符串格式化程序(如f-strings)来格式化字符串。但是,如果他们正在处理旧的Python代码库,很可能会遇到使用模运算符对字符串进行格式化的字符串。
如果用户正在编写或阅读Python 2代码,如果熟悉这种方法将非常有帮助。由于该语法仍在Python 3中使用,所以可能会在最新的Python代码库中找到使用它的开发人员。
在本教程中,我们将讨论如何:
- 使用模运算符(%)格式化字符串。
- 在将值合并到字符串之前将其转换为特定种类。
- 必须指定格式化值占用的垂直空间。
- 使用转换标志调整显示的外观。
- 使用字典映射来指定值,而不是元组。
如果用户熟悉C,Perl和Java中的printf()函数系列,将会注意到它们在Python中不可用。但是,printf()和字符串模运算符之间有相当相似之处。如果用户已经熟悉使用printf(),下面的许多函数将会很熟悉。
但是,如果用户对printf()不熟悉,请不要担心!无需具备printf()的先前经验,即可掌握Python中的模运算字符串格式化。
在Python中使用模运算符进行字符串格式化
我们都可能之前听说过模运算符(%),在处理数字的情况下,它计算除法的余数。
例如:
13 % 4
输出:
1
字符串操作数用于格式化字符串,但模运算符执行不同的功能: 字符串格式化。
下面是字符串模运算的语法:
<format_string> % <values>
在%运算符的左侧是一个包含转换说明符或更多转换说明符的字符串。在右侧,被插入到中,以替换转换说明符。格式化后的字符串是查询的结果。
在这里,我们将首先演示如何使用print()通过字符串模运算符显示格式化的字符串。
示例:
print("%d %s cost $%.2f" % (12, "apples", 3.44))
输出:
12 apples cost $3.44
在字符串模运算中,该字符不仅表示字符串模运算符本身,还表示格式字符串中的转换说明符的开始。在本例中,有三个转换说明符:%d、%s和%.2f。
程序的输出是Python将元组中的每个项都转换为字符串,然后将其插入到格式字符串中,而不是插入到适当的转换说明符中:
- 元组中的第一个元素是数字12,是字符串格式中字符%d的替换值。
- 下一个元素是字符串”apples”的值,是%s的替换值。
- 最后一个元素是浮点数3.44,是%.2f的替换值。
生成的字符串是12个苹果,价格为$3.44,如下图所示:
如果在同一个元组中有多个要添加的值,它们应该包含在一个元组中,就像前面的示例中所示。如果只有一个值,我们可以将它单独写出,而不用括号将其括起来。
示例:
print("Hello, my website name is %s." % "JavaTpoint")
输出:
Hello, my website name is JavaTpoint.
此外,请注意,字符串求模运算不仅用于打印。我们还可以对值进行格式化,然后将其赋给不同的字符串变量。
示例:
welcome_sentence = "Hello, my website name is %s." % "JavaTpoint"
welcome_sentence
输出:
Hello, my website name is JavaTpoint.
如果用户熟悉C编程语言中与printf()相关的函数,它们可能会觉得上述模块字符串格式的格式语法类似于sprintf()。如果不熟悉,不要担心!
转换格式符
转换格式符的各个组成部分都包含在字符串格式中。它们确定了Python在插入字符串格式时的值的格式。
转换格式符以百分号字符开头,可能由多个元素按特定顺序组成:
%[<flags>][<width>][.<precision>]<type>
百分号和<type>
组件都是必需的。其他括号中的组件不重要。
以下表格总结了转换说明符的每个部分的功能:
组件 | 意义 |
---|---|
% |
引入转换说明符 |
<flags> |
指示一个或多个标志,以对格式进行更精细的控制 |
<width> |
指定格式化结果的最小宽度 |
.<precision> |
确定浮点数或字符串输出的长度和精度 |
<type> |
指示要执行的转换类型 |
使用转换类型转换值
转换规范的最后一个元素,唯一的要求是它是除了引导性%字符之外的唯一部分:
%[<flags>][<width>][.<precision>]<type>
这决定了Python在将其值输入格式字符串之前对其进行的转换类型。下面是可以使用的各种转换类型的表格:
<type> |
转换类型 |
---|---|
d, i, u | 十进制整数 |
x, X | 十六进制整数 |
o | 八进制整数 |
f, F | 浮点数 |
e, E | 科学计数法 |
g, G | 浮点数或科学计数法 |
c | 单个字符 |
s, r, a | 字符串 |
% | 单个 ‘%’ 字符 |
在下一节中,我们将学习如何使用这些类型的转换。
整数转换类型
整数值对应于 d, i, u, x, X, 和 o 转换类型。
d, i和u的功能相同。这三个将相应的参数转换为十进制整数的字符串表示。
示例:
"%d, %i, %u" % (123, 123, 123)
输出:
'123, 123, 123'
"%d, %i, %u" % (-123, -123, -123)
输出:
'-123, -123, -123'
我们可以选择值为正数或负数。如果值为负数,将会用减号(-)替换。
转换类型 x 和 X 会转换为表示十六进制数值的字符串。类型 “o” 会转换为表示八进制整数值的字符串。
示例:
"%x, %X" % (252, 252)
输出:
'd4, D4'
输入:
"%o" % 12
输出:
'14'
小写字符 x 将生成小写输出。大写字符 X 将生成大写输出。
我们可以使用转换标志更好地控制最终的格式。
浮点转换类型
转换类型 f 和 F 创建浮点数的字符串表示。而 e 和 E 会生成表示E(科学)表示法的字符串。
示例:
"%f, %F" % (2.132435, 2.13)
输出:
'3.141590, 3.140000'
输入:
"%e, %E" % (1010.0, 101.0)
输出:
'1.010000e+03, 1.010000E+02'
小写字母 f, 和 e 生成小写输出。大写字母F,E则生成大写输出。
g, 和 G 根据指数组成部分的大小和值选择浮点数或 E 输出。
示例:
"%g" % 4.12
输出:
'4.12'
输入:
"%g" % 0.00000007
输出:
'7e-08'
输入:
"%g" % 0.00000007
输出:
'7E-08'
输出对于 e 或 E 是相同的,如果指数小于 -4 或者不小于 -4。这与 f 或 F 是一样的。
像其他浮点数转换类型一样,g 生成小写输出,G 生成大写输出。
字符转换类型
c 转换类型插入一个字符。对应字符的值可以是整数或单个字符字符串。
示例:
"%c" % 123
输出:
'{'
输入:
"%c" % "k"
结果:
'k'
如果您提供了一个整数,Python将把它转换为可打印的字符。这种转换类型还支持转换为Unicode字符。
示例:
"%c" % 8732
输出:
'∜'
用户还可以使用 %c 并传递ASCII或Unicode的代码来在字符串中正确显示格式。
转换类型 s, r, 和 a 通过使用内置函数 str() 和 repr() 和 asii() 生成字符串输出。
示例:
"%s" % "Coffee ☕"
输出:
'Coffee ☕'
输入:
"%r" % "Coffee ☕"
输出:
"'Coffee ☕'"
输入:
"%a" % "Coffee ☕"
输出:
"'Coffee \\u2615\\ufe0f'"
当用户在代码中使用%a时,Python将Unicode字符转换为其ASCII表示形式。
用户可以使用
文字百分比字符(%%)
我们可以通过在格式字符串中指定两个连续的百分比字符(%%)来将百分比字符(%)插入到输出中。格式字符串中的第一个字符引入转换说明符,而第二个字符(%%
)指定转换类型为%。
这种格式化将导致百分之一的字符(或%)包含在我们的输出中。
示例:
"We get %d%% off on %s today only!" % (10, "Apples")
输出:
'We get 10% off on Apples today only!'
这个代码示例展示了两种类型的转换:
- 第一个(%d)是十进制整数转换类型。
- 第二个(%%)是直接输出百分号字符%。
请注意 %%转换类型不需要两个中的任何一个,如右侧所示,它是字符串模运算符(10,“Apples”)。 这种转换类型可以用于在字符串中转义百分号字符,以确保直接输出百分号。
使用宽度和精度水平对齐数据
其和.precision>组件位于转换说明的中间位置。
%[<flags>][<width>][.<precision>]<type>
它们可以单独使用,也可以与一个一起使用。它们通过改变字符串的填充或Python显示的所有值的长度来确定格式化值占用的水平空间的多少。
<width>
组件
字段的最小大小使用<width>
组件。当输出长度小于<width>
时,默认情况下右对齐在一个字段中,并使用ASCII空格字符在左边填充。
示例:
"%4s" % "foo"
输出:
' foo'
输入:
"%4d" % 4
输出:
' 4'
这些字符串中的第一个是”foo”。它由三个字符组成。由于用户将4作为
在第二种情况下,用户选择一个位数的数字”4″作为输入,并请求一个长度为 4 字符的字符串。因此,Python再次在插入表示数字4的字符串之前添加两个空格字符,创建最终长度为 4 字符的字符串。
我们可以更改Python应该使用的填充字符。
如果输出的长度超过输入的长度,它不会产生任何影响。
示例:
"%4d" % 3241
输出:
'3241'
输入:
"%d" % 3241
输出:
'3241'
输入:
"%2s" % "JavaTpoint"
输出:
'JavaTpoint'
输入:
"%s" % "JavaTpoint"
输出:
'JavaTpoint'
在每个示例中,它指示字段的宽度为2。然而,由于我们要求Python写入的值大于两个字符,这导致与我们根本没有提供
.<precision>
组件
.<precision>
转换说明符组件影响浮点型转换和字符转换的类型。
对于浮点数转换类型f、F、e和E,确定小数点后有多少位数字。
示例:
"%.2f" % 213.73571
输出:
'213.74'
输入:
"%.2e" % 213.73571
输出:
'2.14e+02'
对于浮点数转换类型,我们可以使用”g”以及”G”来确定小数点前后的有效数字的数量。
示例:
"%.2g" % 213.73571
输出:
'2.1e+02'
使用s、r和a类型的字符转换格式化的字符串值被缩短到由.precision组件指定的长度。
示例:
"%.4s" % "JavaTpoint"
输出:
'Java'
在这个示例中,我们需要确定输入值“JavaTpoint”的长度为8个字符。然而,我们设置了.<precision>
为4。因此,Python只会显示字符串输入中的前四个字符。
用户可能会看到<width>
和.<precision>
。它们可以一起使用。
示例:
"%8.3f" % 213.73571
输出:
' 213.736'
输入:
"%8.3s" % "JavaTpoint"
输出:
' Jav'
我们可以使用星号字符(*
)来占位,同时提及
>>> "%*d" % (9, 141)
输出:
' 141'
输入:
"%.*d" % (9, 13)
输出:
'000000013'
输入:
"%*.*d" % (9, 4, 123)
输出:
' 0141'
如果我们的值是一个不变的值,那么我们很可能不需要使用这个功能。在上面的示例中,使用占位符或直接使用值之间没有功能上的区别。
示例:
"%10d" % 14
输出:
' 14'
输入:
"%.10d" % 14
输出:
'0000000014'
输入:
"%10.5d" % 14
输出:
' 00014'
使用占位符星号在定义宽度或精度时更具吸引力。
例如:
for i in range(3):
... w = int(input("Enter width: "))
... print("[%*s]" % (w, "ABC"))
输出:
Enter width: 4
[ ABC]
Enter width: 2
[ABC]
Enter width: 7
[ ABC]
此语法可以在执行时设置宽度和精度,这意味着它们在每次运行时可能不同。
使用转换标志调整输出
我们还可以在字符:% 中间指定转换标志:
%[<flags>][<width>][.<precision>]<type>
他们允许我们在更具体的细节上改变特定类型的转换显示。
字符 | 控制 |
---|---|
# |
显示浮点和整数值的十进制或基点 |
0 |
用于小于指定字段宽度的值的填充 |
- |
验证小于指定字段宽度的字段 |
+ |
数值前导符号的显示 |
' ' (空格) |
数字前导符号的显示 |
哈希标志(#)
#标志允许在十六进制和八进制转换类型的格式化输出中显示基本信息。在使用 o 类型的转换时,此标志将添加前导的“0o”。对于那些使用“x”和“X”类型的转换的情况,此标志将添加引导的“0x”或“0X”。
示例:
"%#o" % 12
输出:
'0o14'
输入:
"%#x" % 12, "%#X" % 12
输出:
('0xc', '0XC')
#
标记在十进制转换类型中被忽略。当使用十进制转换器的类型,如d, i和十进制转换类型u时,#
标记不适用。
number标记使得浮点数值在输出中包含小数点。通常情况下,如果没有任何数字跟随,浮点数值不会有小数点。这个标记是需要包含小数位的附加项。
示例:
"%.0f" % 412
输出:
'412'
输入:
"%#.0f" % 412
输出:
'412.'
输入:
"%.0e" % 412
输出:
'4e+02'
输入:
"%#.0e" % 412
输出:
'4.e+02'
使用#标志来包含小数点是必需的。Number标志也可以显示使用E记数法的值。代码示例演示了这一点。
零标志(0)
如果格式化的数值小于字段大小的尺寸,标准行为是用数字右侧的ASCII空格填充字段。0标志选项会使用“0”字符进行填充。
示例:
"%04d" % 234
输出:
'0234'
输入:
"%08.2f" % 3.2
输出:
'00003.20'
0 标志用于所有类型的数字转换:d、i、u、x、X、o、f、F、e、E、g 和 G。
减号标志 (-)
如果以指定字段宽度格式化的值小于该宽度,则通常会在字段内右对齐。在这种情况下,连字符 (-) 标志将导致该值在字段内左对齐。
示例:
"%-5d" % 234
输出:
'234 '
输入:
"%-8.2f" % 234.3
输出:
'234.30 '
输入:
"%-*s" % (9, "ABC")
输出:
'ABC '
利用标志(-)可以指定三种类型的字符串转换:s、a和r,还可以与其他类型的数字转换一起使用。如果类型是数字,并且同时出现零和字符“-”,则不考虑0。
加号标志(+)
默认情况下,所有正数值都不包括前导符号字符。另外,还可以使用(+)标志,在数字输出的左侧添加一个加号符号(+)
示例:
"%+d" % 4
输出:
'+4'
输入:
"%+5d" % 4
输出:
' +4'
输入:
"%5d" % 4
输出:
' 4'
如果我们比较这两个输出,可以看到Python在计算输出宽度时,会考虑到我们使用此标志添加的加号字符。
这个标志不受负数值的影响,通常包含一个负号 ( – )。与加号符号类似,Python在计算输出大小时也会考虑到这个加号字符。
空格字符标志(’ ‘)
空格字符标志(’ ‘)是在正数值前面额外添加的空格字符:
"% d" % 4
输出:
' 4'
就像标志不会影响负数值一样,这些值总是伴随着一个下划线(-)。
例如:
"% d" % 4
输出:
' 4'
输入:
"% d" % -3
输出:
'-3'
输入:
"%d" % -3
输出:
'-3'
使用+标志和空格标志之一,将帮助我们始终对齐正数和负数。
通过字典映射来指定值
我们可以将字符串格式中插入的格式字符串定义为字典,而不是元组。在这种情况下,每个转换说明符必须在“%”字符后面的括号中包含任何与字典相关的键。
示例:
"%d %s cost $%.2f" % (4, "apples", 3.74)
输出:
'4 apples cost $3.74'
输入:
data = {"quantity": 4, "item": "apples", "price": 3.74}
template = "%(quantity)d %(item)s cost $%(price).2f"
template % data
输出:
'4 apples cost $3.74'
使用此方法,我们可以定义要由任何序列插入的值:
data = {" quantity": 4, "item": "apples", "price": 3.74}
ad_1 = "%(quantity)d %(item)s cost $%(price).2f"
ad_1 % data
输出:
'4 apples cost $3.74'
输入:
ad_2 = "You'll pay $%(price).2f for %(item)s, if you buy %(quantity)d"
ad_2 % data
输出:
"You'll pay $3.74 for apples, if you buy 4"
下面列出的转换说明符组件– <flags>, <width>, and .<precision>
–仍然以我们使用元组时的方式工作。可以使用其中任何一个将字典定义为一个字典:
"Quantity: %(quantity)03d" % data
输出:
'Quantity: 004'
输入:
"Item: %(item).4s" % data
输出:
'Item: apple'
在上面的代码片段示例中,我们使用了伴随第一个示例的0标志,并带有估计值5的第二个示例。
可以使用字典映射来定义输入值,这对于那些希望只需指定一次输入值然后更改其在不同输出中显示顺序的人特别有帮助。
结论
我们对字符串模运算符有了很好的理解。这是一种在Python中使用的旧的格式化技术。由于这种技术仍然有效并且广泛应用于Python 2中,熟悉这种特定语法的基础知识是很有帮助的。
在本课程中,我们学会了:
- 使用模运算符(%)来格式化字符串。
- 在将值插入字符串之前将其转换为特定类型。
- 指示格式化值所占据的水平区域。
- 使用转换标志来调整显示外观。
- 使用字典映射来指定值,而不是使用元组。