呆鸟云:
format()
函数是格式化字符串的另一种方式。该函数接受两个参数:要格式化的值及格式说明符。
例 22 介绍了 format()
函数的使用方法及使用 f-string 的等效方法。
1>>> format(-123.4567, "+9.2f")
2' -123.46'
3>>> f"{-123.456:+9.2f}"
4' -123.46'
5
6>>> format(0.125, ".2%")
7'12.50%'
8>>> f"{0.125:.2%}"
9'12.50%'
format()
函数使用与 f-strings 相同的格式规范迷你语言。
例 22 中的小例 1 使用 +9.2f
显示的字符串是带符号的浮点数,填充到 9 个字符,并四舍五入到小数点后两位。
例 22 中的小例 2 使用 .2%
以百分比的形式显示有两个小数的浮点数。
与 format()
函数相比,f-string 的代码更紧凑,也更易读。
Python 早期版本中还提供了 str.format()
方法,该方法需要在字符串中插入替代字段,以指定数据的位置。
此外,还要将格式说明符添加到替代字段中,以指定数据显示的格式。
最后,以与替代字段相同的顺序将数据作为参数传递给 .format()
。
str.format()
的使用方法如例 23 所示。
1>>> opposite = 1.234
2>>> adjacent = 5.678
3>>> hypotenuse = (opposite**2 + adjacent**2) ** 0.5
4>>> template = "Opposite = {:0.1f}, Adjacent = {:0.2f}, Hypotenuse = {:0.3f}"
5>>> template.format(opposite, adjacent, hypotenuse)
6'Opposite = 1.2, Adjacent = 5.68, Hypotenuse = 5.811'
从例 23 可以看出,替换字段的占位符按顺序把参数传递给 .format()
方法。尽管这种方式没有 f-string 易读,但仍使用相同的迷你语言定义字符串的格式。
也可以使用关键字将值传递给 .format()
。当把关键字添加到字符串的替换字段中时,相应的值会在显示字符串时插入其中。实现方式如例 24 所示。
1>>> template = (
2... "Opposite = {opposite:0.1f}, "
3... "Adjacent = {adjacent:0.2f}, "
4... "Hypotenuse = {hypotenuse:0.3f}"
5... )
6>>> template.format(
7... hypotenuse=(1.234**2 + 5.678**2)**0.5,
8... adjacent=5.678,
9... opposite=1.234
10... )
11'Opposite = 1.2, Adjacent = 5.68, Hypotenuse = 5.811'
例 24 通过关键字把参数传递给 .format()
。
注意:当使用关键字传递参数时,参数的顺序并不重要,只要关键字与格式说明符中的占位符匹配即可,Python 会进行替换。
除了把值一个一个地传给关键字参数,还可以使用 Python 字典批量传入参数。实现方式如例 25 所示。
1>>> data = {
2... "opposite": 1.234,
3... "adjacent": 5.678,
4... "hypotenuse": (1.234**2 + 5.678**2) ** 0.5,
5... }
6
7>>> template = (
8... "Opposite = {opposite:0.1f}, "
9... "Adjacent = {adjacent:0.2f}, "
10... "Hypotenuse = {hypotenuse:0.3f}"
11... )
12
13>>> template.format(**data)
14'Opposite = 1.2, Adjacent = 5.68, Hypotenuse = 5.811'
例 25 使用 **
(解包操作符)将 data
字典传递给 .format()
,把字典的键作为命名参数,并把字典的值作为命名参数的值。
例 25 的代码写法与 f-strings 语法非常接近。甚至还可以创建自定义的数字格式化模板。自定义模板的方式如例 26 所示。
1>>> num = "{:{align}{width}.{precision}f}"
2>>> print(
3... num.format(
4... 123.236, align="<", width=8, precision=2
5... )
6... )
7123.24
例 26 首先把数字和命名参数一起传递给 .format()
,以此来构建格式说明符,然后再使用 num
模板格式化数字。
.format()
还支持在运行时动态定义格式说明符。假设要把单词填充到比其长度多 4 个字符的宽度,实现方式如例 27 所示。
1>>> text = "Python is cool"
2>>> padded_words = [
3... "{word:*^{length}}".format(word=word, length=len(word) + 4)
4... for word in text.split()
5... ]
6
7>>> padded_words
8['**Python**', '**is**', '**cool**']
例 27 中的格式说明符包含了 .format()
要接收的参数名称。
word
用于接收要格式化的单词 。
length
用于接收动态计算的宽度。
在格式说明符中嵌套精度的替换字段 {length}
。其中,*
是要填充的字符,^
表示输出结果居中。
padded_words
列表是使用列表推导式创建的。调用 .split()
拆分 text
变量,根据空格将 text
字符串分隔为包含 3 个单词的列表。然后,使用 for
循环输出每个单词,并把它们传递给 .format()
。
当 .format()
接收单词时,它的值分配给 word
变量,其长度加上 4 个字符后分配给 length
变量。然后,在格式说明符中使用这些变量,以在 padded_words
中生成格式化的字符串。
练习 8:例 27 使用 str.format()
方法生成了字符串列表 ['**Python**','**is**','**cool**']
。请使用 f-string 语法编写代码生成同样的字符串列表。
练习 9:使用 numbers = [1234.56789, 123.456789, 12.3456789, 1.23456789]
列表,编写格式说明符生成 numbers_formatted
列表,包含 ["1,234.5679","123.457","12.35","1.2"]
。
每个数字都要进行四舍五入,使小数点前后的数字相同。
虽然小编已经尽力避免错误,但本文仍可能存在 bug,欢迎读者在公众号后台进行反馈。
推荐阅读
32 个 Python 实例彻底解析 f-String 格式化浮点数 001【推荐收藏】
32 个 Python 实例彻底解析 f-String 格式化浮点数 002【推荐收藏】
32 个 Python 实例彻底解析 f-String 格式化浮点数 003【推荐收藏】