字符串的格式化主要有三种方式,分别是使用 %格式化,format方法格式化,fstring格式化。
str_format = "I'm %s. I'm %d years old"
string = str_format % ('lilei', 14)
print(string)
str_format是模板,在模板里有格式符,示例中有两个格式符,分别是%s, %d。这些格式符为真实值预留了位置,并说明了真实值应该呈现的格式,%s表示字符串,%d表示整数,第二行 使用 % 进行格式化时,后面紧跟一个元组,这个元组将多个值传递给模板,每个值依次对应到模板里的一个格式符。上面的例子输出的结果是
I'm lilei. I'm 14 years old
格式符有很多种,你需要根据实际需要来选择模板里的格式符
%s 字符串 (采用str()的显示)
%r 字符串 (采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
%% 字符"%"
我个人十分喜欢使用format方法对字符串进行格式化操作,因为相比于使用%操作符,format方法更加直观和简单,尤其是在格式化时与字典,元组,对象相结合的情况下,简直爽歪了。
log = "{id}-{type}-{msg}"
print(log.format(id=1,type='debug',msg=u'测试连接'))
同样需要一个格式化模板,与使用%操作符格式化不同的时,使用format方法进行格式化时,使用{}来为真实值预留位置,大括号内你可以随意编写变量名称,然后在format方法里为这些变量赋予真实值。
如果真实值存储在一个字典里,且模板里预留了好多位置需要填充真实值,那我真的不想在format方法里为那么多参数赋值
info = {
    'id':1,
    'type':'debug',
    'msg':u'测试连接'
}
log = "{0[id]}-{0[type]}-{0[msg]}".format(info)
print(log)
log = "{info[id]}-{info[type]}-{info[msg]}".format(info=info)
print(log)
这两种格式化的方式都可行,我个人推荐使用第二种。
info = (1,'debug',u'测试连接')
log = "{0[0]}-{0[1]}-{0[2]}".format(info)
print(log)
log = "{info[0]}-{info[1]}-{info[2]}".format(info=info)
print(log)
除了字典和元组,还可以使用对象
class Info(object):
    def __init__(self, id, type, msg):
        self.id = id
        self.type = type
        self.msg = msg
info = Info(1,'debug',u'测试连接')
log = "{info.id}-{info.type}-{info.msg}".format(info=info)
print(log)
使用format方法时,如果为了方便,也可以不指定关键字参数,而是依据参数顺序格式化字符
log = "{}-{}-{}"
print(log.format(1, 'debug', '测试连接'))
format方法里的参数会依次填入字符串中的{}中
在格式化字符串时,有时需要控制一下宽度,比如下面这段打印九九乘法表的代码
for i in range(1, 10):
    line = ""
    for j in range(1, i+1):
        line += "{left} * {right} = {product} ".format(left=i, right=j, product=i*j)
    print(line)
输出结果
1 * 1 = 1
2 * 1 = 2  2 * 2 = 4
3 * 1 = 3  3 * 2 = 6  3 * 3 = 9
4 * 1 = 4  4 * 2 = 8  4 * 3 = 12  4 * 4 = 16
5 * 1 = 5  5 * 2 = 10  5 * 3 = 15  5 * 4 = 20  5 * 5 = 25
6 * 1 = 6  6 * 2 = 12  6 * 3 = 18  6 * 4 = 24  6 * 5 = 30  6 * 6 = 36
7 * 1 = 7  7 * 2 = 14  7 * 3 = 21  7 * 4 = 28  7 * 5 = 35  7 * 6 = 42  7 * 7 = 49
8 * 1 = 8  8 * 2 = 16  8 * 3 = 24  8 * 4 = 32  8 * 5 = 40  8 * 6 = 48  8 * 7 = 56  8 * 8 = 64
9 * 1 = 9  9 * 2 = 18  9 * 3 = 27  9 * 4 = 36  9 * 5 = 45  9 * 6 = 54  9 * 7 = 63  9 * 8 = 72  9 * 9 = 81
注意看第3列,明显没有对齐,原因在于第2列的乘积出现了大于10的情况,挤占了空间,为了能更美观的显示效果,我们需要控制格式化字符串时的宽度,只需要将待格式化的字符串稍稍做一下修改即可
line += "{left} * {right} = {product:3}  ".format(left=i, right=j, product=i*j)
我指定product被格式化以后站3个字符的宽度,这样,不论乘积是否大于10,都占3个字符宽度
1 * 1 =   1
2 * 1 =   2  2 * 2 =   4
3 * 1 =   3  3 * 2 =   6  3 * 3 =   9
4 * 1 =   4  4 * 2 =   8  4 * 3 =  12  4 * 4 =  16
5 * 1 =   5  5 * 2 =  10  5 * 3 =  15  5 * 4 =  20  5 * 5 =  25
6 * 1 =   6  6 * 2 =  12  6 * 3 =  18  6 * 4 =  24  6 * 5 =  30  6 * 6 =  36
7 * 1 =   7  7 * 2 =  14  7 * 3 =  21  7 * 4 =  28  7 * 5 =  35  7 * 6 =  42  7 * 7 =  49
8 * 1 =   8  8 * 2 =  16  8 * 3 =  24  8 * 4 =  32  8 * 5 =  40  8 * 6 =  48  8 * 7 =  56  8 * 8 =  64
9 * 1 =   9  9 * 2 =  18  9 * 3 =  27  9 * 4 =  36  9 * 5 =  45  9 * 6 =  54  9 * 7 =  63  9 * 8 =  72  9 * 9 =  81
f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法。f-string让字符串的格式化更加简便,本质上f-string不是字符串常量,而是一个可以在运行时运算求值的表达式。
color = 'red'
string = f"I like {color}"
print(string)
从形式看,f-string是以f或F装饰引领的字符串,内部使用大括号为真实值预留位置,那么大括号所标注的需要被替换的字段填充什么值呢?
填充什么值,要看f-string所在的作用域里与大括号内相对应的变量值。在本示例中,大括号里的字段名称是color,而当前所在作用域里恰好有一个变量的名称叫做color,那么字符串格式化时就会填充变量color的值,使用f-string的优势就在于它省略了这个指明填充值的过程。不仅如此,f-string还提供了更加强大的功能
color = 'red'
string = f"I like {color.upper()}"
print(string)
大括号里甚至可以传入表达式和函数,在这个示例中,真实值是color变量转大写的结果。
 
            扫描关注, 与我技术互动
QQ交流群: 211426309
 
                        分享日常研究的python技术和遇到的问题及解决方案