字符串format()方法格式化指定的值,并将其插入字符串的占位符内。
占位符使用大括号 {} 定义。请在下面的“占位符”部分中了解有关占位符的更多信息。
format() 方法返回格式化的字符串。
format()方法的语法为:
template.format(p0, p1, ..., k0=v0, k1=v1, ...)
在这里,p0, p1,...分别是位置参数和k0, k1,...具有值的关键字参数v0, v1,...。
并且,template是格式代码与参数占位符的混合。
字符串format()参数
format()方法采用任意数量的参数。但是,分为两种类型的参数:
位置参数 -可以使用花括号{index}中的参数索引访问的参数列表
关键字参数 -键=值类型的参数列表,可以使用花括号{key}中的参数键来访问
字符串format()返回值
format()方法返回格式化的字符串。
字符串format()如何工作?
format()读取传递给它的参数的类型,并根据字符串中定义的格式代码对其进行格式化。
对于位置参数
在这里,参数0是字符串“ Adam”,参数1是浮点数230.2346。
注意: 在Python中,参数列表从0开始。
该字符串"Hello {0}, your balance is {1:9.3f}"是模板字符串。这包含用于格式化的格式代码。
花括号只是要放置的参数的占位符。在上面的实例中,{0}是“Adam”的占位符,{1:9.3f}是230.2346的占位符。
由于模板字符串引用format()参数如{0}和{1},因此这些参数是位置参数。它们也可以在没有数字的情况下被引用,因为{}和Python在内部将它们转换为数字。
在内部,
由于"Adam"是第0 个参数,因此将其放在{0}的位置。由于{0}不包含任何其他格式代码,因此它不执行任何其他操作。
然而,第一个参数230.2346不是这样的。在这里,{1:9.3f}将230.2346放在它的位置上,并执行9.3f操作。
f指定格式正在处理浮点数。如果未正确指定,它将发出错误。
“.”之前的部分。(9)指定数字(230.2346)可以采用的最小宽度/填充。在这种情况下,230.2346至少被分配9个位置,包括“.”。
如果未指定对齐选项,则将其对齐到其余空格的右侧。(对于字符串,它向左对齐。)“.”之后的部分。(3)将小数部分(2346)截断为给定的数字。在这种情况下,3346后将截断2346。
剩余数字(46)会四舍五入,输出235。
对于关键字参数
我们从上面使用了相同的示例来展示关键字和位置参数之间的区别。
在这里,我们不仅使用参数,还使用了键值作为参数。即name="Adam"和blc=230.2346。
由于这些参数是由它们的键作为{name}和{blc:9.3f}引用的,因此它们被称为关键字或命名参数。
在内部,
占位符{name}替换为name的值-“ Adam”。 由于它不包含任何其他格式代码,因此放置了“ Adam”。
对于参数blc = 230.2346,占位符{blc:9.3f}将替换为值230.2346。但是在替换它之前,像前面的示例一样,它对其执行9.3f操作。
输出230.235。小数部分在3位后被截断,其余数字四舍五入。同样,总宽度分配为9,在左侧留两个空格。
使用format()的基本格式
format()方法允许使用简单的占位符进行格式化。
示例1:默认,位置和关键字参数的基本格式
# 默认参数 print("Hello {}, your balance is {}.".format("Adam", 230.2346)) # 位置参数 print("Hello {0}, your balance is {1}.".format("Adam", 230.2346)) # 关键词参数 print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346)) # 混合参数 print("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))
运行该程序时,所有输出将相同:
Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346.
注意:对于混合参数,关键字参数必须始终跟随位置参数。
使用format()格式化数字
您可以使用下面给出的格式说明符设置数字格式:
类型 | 含义 |
---|---|
d | 小数整数 |
c | 对应的Unicode字符 |
b | 二进制格式 |
o | 八进制格式 |
x | 十六进制格式(小写) |
X | 十六进制格式(大写) |
n | 与“ d”相同。除了使用数字分隔符的当前语言环境设置 |
e | 指数表示法。(小写字母e) |
E | 指数符号(大写E) |
f | 显示定点编号(默认值:6) |
F | 与“ f”相同。除了将“ inf”显示为“ INF”和“ nan”显示为“ NAN” |
g | 通用格式。将数字四舍五入为p个有效数字。(默认精度:6) |
G | 与“ g”相同。如果数量很大,则除外切换到“ E”。 |
% | 百分比。乘以100并以%结尾。 |
示例2:简单的数字格式
# 整数参数 print("数字:{:d}".format(123)) # 浮点参数 print("浮点数:{:f}".format(123.4567898)) # 八进制,二进制和十六进制格式 print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))
当您运行该程序时,输出将是:
数字: 123 浮点数:123.456790 bin: 1100, oct: 14, hex: c
示例3:用int和float填充数字格式
# 最小宽度的整数 print("{:5d}".format(12)) # 宽度对于比填充更长的数字不起作用 print("{:2d}".format(1234)) # 浮点数的填充 print("{:8.3f}".format(12.2346)) # 最小宽度为0的整数 print("{:05d}".format(12)) # 填充用0填充的浮点数 print("{:08.3f}".format(12.2346))
当您运行该程序时,输出将是:
121234 12.235000120012.235
这里,
在第一个语句中,{:5d}采用整数参数并指定最小宽度5。由于未指定对齐方式,因此它向右对齐。
在第二个语句中,您可以看到宽度(2)小于数字(1234),因此它不需要在左边留任何空格,也不会截断该数字。
与整数不同,浮点数具有整数和小数部分。 并且,定义为该数字的最小宽度是整个包括“.”的两个部分。
在第三条语句中,{:8.3f}将小数部分截断为3位,四舍五入最后两位数字。而且,该数字现在为12.235,整个宽度为8,在左侧保留2个位置。
如果要用零填充其余位置,请在格式说明符之前放置零。它适用于整数和浮点数:{:05d}和{:08.3f}。
示例4:带符号数字的数字格式
# 显示+号 print("{:+f} {:+f}".format(12.23, -12.23)) # 仅显示-号 print("{:-f} {:-f}".format(12.23, -12.23)) # 显示+号的空格 print("{: f} {: f}".format(12.23, -12.23))
当您运行该程序时,输出将是:
+12.230000 -12.230000 12.230000 -12.230000 12.230000 -12.230000
对齐数字格式
将数字指定一定的宽度时,运算符<,和用于对齐。^>=
类型 | 含义 |
---|---|
< | 左对齐剩余空间 |
^ | 中心对齐剩余空间 |
> | 与剩余空间右对齐 |
= | 将带符号(+)(-)强制到最左边 |
示例5:左对齐,右对齐和居中对齐的数字格式
# 右对齐的整数 print("{:5d}".format(12)) # 具有中心对齐的浮点数 print("{:^10.3f}".format(12.2346)) # 整数左对齐,用0填充 print("{:<05d}".format(12)) # 中心对齐的浮点数 print("{:=8.3f}".format(-12.2346))
当您运行该程序时,输出将是:
12 12.235 12000- 12.235
注意:对于第三个示例,左对齐用零填充整数可能会导致问题,该示例返回12000而不是12。
使用format()进行字符串格式化
作为数字,可以使用format()以类似的方式格式化字符串。
示例6:带填充和对齐的字符串格式
# 左对齐的字符串填充 print("{:5}".format("cat")) # 右对齐的字符串填充 print("{:>5}".format("cat")) #中心对齐的字符串填充 print("{:^5}".format("cat")) # 中心对齐的字符串填充 # 和 '*' 填充字符 print("{:*^5}".format("cat"))
当您运行该程序时,输出将是:
cat cat cat *cat*
示例7:使用format()截断字符串
# 将字符串截断为3个字母 print("{:.3}".format("caterpillar")) # 将字符串截断为3个字母 # 和 填充 print("{:5.3}".format("caterpillar")) # 将字符串截断为3个字母, # 填充和中心对齐 print("{:^5.3}".format("caterpillar"))
当您运行该程序时,输出将是:
catcat cat
使用format()格式化类和字典成员
Python内部getattr()以“ .age”形式用于类成员。并且,它使用__getitem__()查找“[index]”形式的字典成员。
示例8:使用format()格式化类成员
# define Person class class Person: age = 23 name = "Adam" # 格式化age print("{p.name}'年龄是 : {p.age}".format(p=Person()))
当您运行该程序时,输出将是:
Adam's 年龄是 : 23
在这里,Person对象作为关键字参数p传递。
在模板字符串中,分别使用.name和.age访问Person的name和age。
示例9:使用format()格式化字典成员
# 定义Person字典 person = {'age': 23, 'name': 'Adam'} # 格式化age print("{p[name]}'s age is: {p[age]}".format(p=person))
当您运行该程序时,输出将是:
Adam's age is: 23
与class类似,person字典作为关键字参数p传递。
在模板字符串中,分别使用[name]和[age]访问人员的name和age。
有一种更简单的方法可以使用Python格式化字典str.format(**mapping)。
# 定义Person字典 person = {'age': 23, 'name': 'Adam'} # 格式化age print("{name}'s age is: {age}".format(**person))
** 是格式参数(最小字段宽度)。
使用format()作为格式代码的参数
您还可以动态传递格式代码,例如精度,对齐,填充字符作为位置或关键字参数。
示例10:使用format()的动态格式化
# 动态字符串格式模板 string = "{:{fill}{align}{width}}" # 将格式代码作为参数传递 print(string.format('cat', fill='*', align='^', width=5)) # 动态浮点格式模板 num = "{:{align}{width}.{precision}f}" # 将格式代码作为参数传递 print(num.format(123.236, align='<', width=8, precision=2))
运行该程序时,输出为:
**cat**123.24
这里,
在第一个示例中," cat"是要格式化的位置参数。同样,fill='*',align='^'和width=5是关键字参数。
在模板字符串中,这些关键字参数不是作为要打印的普通字符串而是作为实际格式代码检索的fill, align 和 width。
参数将替换相应的已命名占位符,并且字符串“ cat”将相应地设置格式。同样,在第二个示例中,123.236是位置参数,并且align,width和precision作为格式代码传递到模板字符串。
带有format()的其他格式选项
format()还支持特定于类型的格式设置选项,例如日期时间格式和复数格式。
format()内部调用__format__()从datetime,而format()访问复数的属性。
您可以轻松地重写任何对象的__format __()方法以进行自定义格式设置。
示例11:使用format()和重写__format __()方法的特定于类型的格式化
import datetime # 日期时间格式 date = datetime.datetime.now() print("当前时间: {:%Y/%m/%d %H:%M:%S}".format(date)) # 复数格式 complexNumber = 1+2j print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber)) # 自定义 __format__()方法 class Person: def __format__(self, format): if(format == 'age'): return '23' return 'None' print("Adam's 年龄是: {:age}".format(Person()))
运行该程序时,输出为:
当前时间: 2020/04/17 14:33:02 Real part: 1.0 and Imaginary part: 2.0 Adam's 年龄是: 23
这里,
对于datetime:
当前日期时间作为位置参数传递给format()方法。
并且,在内部使用__format __()方法,format()可访问年,月,日,时,分和秒。对于复数:
1 + 2j在内部转换为ComplexNumber对象。
然后访问其属性real和imag,数字被格式化。重写__format __():
与datetime一样,您可以重写自己的__format __()方法以进行自定义格式设置,当以{:age}访问时,该格式将返回年龄
您也可以使用对象 __str__() 和 __repr__() 功能,通过使用format()的简写表示法。
像__format __()一样,您可以轻松重写对象的__str __()和__repr_()方法。
示例12:使用format()的__str()__和__repr()__简写分别为!r和!s
# __str__() 和 __repr__() 简写为 !r 和 !s print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat")) # __str__() 和 __repr__() 实现类 class Person: def __str__(self): return "STR" def __repr__(self): return "REPR" print("repr: {p!r}, str: {p!s}".format(p=Person()))
运行该程序时,输出为:
Quotes: 'cat', Without Quotes: cat repr: REPR, str: STR