前言:
这部分是此次格式转换脚本的核心,很有可能bug就在这里了。
第7章 字符串
7.3 字符串格式化
7.3.1 使用 %
符号进行格式化(选讲)
使用 %
符号进行字符串格式化的形式如图 7-1 所示,格式运算符 %
后面为需要格式化的内容,前面的部分为格式字符串。
格式运算符的形式如下:
%[-][+][0][m][.n]格式字符
-
%
:表示格式化的开始 -
-
:指定左对齐输出 -
+
:对正数加上正号 -
0
:空位填0
-
m
:指定最小宽度 -
.n
:指定精度 -
格式字符
:指定类型
图 7-1 字符串格式化的形式
Python 支持大量的格式字符,表 7-2 列出了常用的一部分。
表 7-2 格式字符
格式字符 | 说明 | 格式字符 | 说明 |
---|---|---|---|
%s | 字符串(采用 str() 显示) | %r | 字符串(采用 repr() 显示) |
%d | 十进制整数 | %i | 十进制整数 |
%o | 八进制整数 | %x | 十六进制整数 |
%e | 指数(基底写为 e) | %E | 指数(基底写为 E) |
%f 、%F | 浮点数 | %g | 指数(e)或浮点数 |
%G | 指数(E)或浮点数 | %c | 单个字符 |
%% | 字符 % |
使用这种方式进行字符串格式化时,要求被格式化的内容和格式字符之间必须一一对应。
示例:
>>> x = 1235
>>> s = "%o" % x
>>> s
'2323'
>>> h = "%x" % x
>>> h
'4d3'
>>> f = "%.6e" % 1235
>>> f
'1.235000e+03'
>>> "%s" % [1, 2, 3]
'[1, 2, 3]'
7.3.2 使用 format()
方法进行字符串格式化
除了 %
方式的字符串格式化,目前 Python 社区更推荐使用 format()
方法进行格式化。该方法非常灵活,不仅可以使用位置进行格式化,还支持使用关键参数进行格式化,更妙的是支持序列解包格式化字符串,为程序员提供了非常大的方便。
在字符串格式化方法 format()
中可以使用的格式包括:
-
b
:二进制格式 -
c
:把整数转换成 Unicode 字符 -
d
:十进制格式 -
o
:八进制格式 -
x
:小写十六进制格式 -
X
:大写十六进制格式 -
e
/E
:科学计数法格式 -
f
/F
:固定长度的浮点数格式 -
%
:使用固定长度浮点数显示百分数
Python 3.6 开始支持在数字常量的中间位置使用单个下划线作为分隔符来提高数字的可读性,format()
也提供了对下划线的支持。
示例:
>>> 1 / 3
0.3333333333333333
>>> print("{:.3f}".format(1 / 3)) # 保留 3 位小数
0.333
>>> "{:8}".format(3.5)
'3.500000'
>>> "{:_x}".format(1000000) # Python 3.6 及更高版本支持
'f_4240'
>>> position = (5, 8, 13)
>>> print("X:{0[0]}; Y:{0[1]}; Z:{0[2]}".format(position)) # 使用元组的同时格式化多个值
X:5; Y:8; Z:13
7.3.3 格式化的字符串常量
从 Python 3.6 开始支持一种新的字符串格式化方式,官方称为 Formatted String Literals
,简称 f-字符串
,其含义与 format()
方法类似,但形式更加简洁。
示例:
>>> name = 'Dong'
>>> age = 39
>>> f"My name is {name}, and I am {age} years old."
'My name is Dong, and I am 39 years old.'
>>> width = 10
>>> precision = 4
>>> value = 11 / 3
>>> f"result: {value:{width}.{precision}}"
' 3.667'
f-字符串
提供了一种更加简洁和方便的方式进行字符串的格式化,尤其适用于需要动态插入变量内容的情境。
7.3.4 使用 Template
模板进行字符串格式化(选讲)
Python 中还提供了一种使用 Template
模板进行字符串格式化的方法,可以通过导入 string
模块来使用 Template
类。这种方式适合一些简单的字符串替换场景,尤其是在需要提供安全的字符串替换时,因为它避免了一些与 %
或 format()
相关的潜在注入问题。
示例:
from string import Template
t = Template('My name is $name, and I am $age years old.')
d = {'name': 'Dong', 'age': 39}
# 使用 substitute() 方法替换模板中的占位符
result = t.substitute(d)
print(result)
输出:
My name is Dong, and I am 39 years old.
可以看到,Template
模板使用 $
符号来表示占位符,并且通过 substitute()
方法来进行替换。与 substitute()
类似,Template
还提供了 safe_substitute()
方法,用于在键缺失时提供默认值,而不会抛出异常。
示例:
from string import Template
t = Template('Hello, $name! Your balance is $balance dollars.')
d = {'name': 'Alice'}
# 使用 safe_substitute() 方法进行替换
result = t.safe_substitute(d)
print(result)
输出:
Hello, Alice! Your balance is $balance dollars.
Template
模板提供了一种简单而安全的字符串格式化方法,尤其适用于需要避免格式注入攻击的场景。