第22讲:Python使用花括号作为占位符对字符串进行格式化

在前面我们说了使用百分号作为占位符,对字符串进行格式化,较为简单,下面使用花括号作为占位符对字符串进行格式化,稍微有些复杂。

使用花括号作为占位符的应用非常普遍,主要在于其非常灵活以及功能强大。

1.使用百分号作为占位符的概念

使用花括号作为占位符,格式化指定字符串时需要调用format方法传递字符串,才可以对字符串进行格式化输出,语法格式如下:

print('格式 {}'.format(字符串))

花括号作为占位符的格式化原理和百分号作为占位符的格式化原理,大差不差,字符串的实际值在格式化时,就会替换占位符,从而带着格式输出格式化后的内容。

如下所示,在格式化的格式规则中,占位符用花括号{}表示,然后调用format方法传递字符串,要用格式规则去调用format函数,当有多个占位符时,format中的字符串按照顺序依次替换占位符。

image-20220805165431084

format中字符串的位置号,可以在{}占位符中指定。format方法中指定的第一个字符串其位置号为0,第二个字符串的位置号为1。

这样一来占位符的数量无需和要格式化的字符串数量相等,例如占位符有3个,字符串只传递两个,那么就在占位符中分别指定对应的字符串的位置号,只要所有占位符最后能被替换成实际值,就不会导致格式化失败。

一会会演示这个现象。

2.花括号占位符的简单使用

1)格式化规则中只有一个占位符

建议将格式化的字符串(格式规则)作为对象值赋值给变量,因为花括号的占位符需要由规则调用format函数传递要格式化的字符串的,放在变量里代码书写比较美观。

hkhformat = '订阅了CSDN某大佬的付费专栏:{}'
sc = "《MySQL DBA封神打怪之路》"
print(hkhformat.format(sc))

#如果不想使用变量,那么就参照如下所示
print('订阅了CSDN某大佬的付费专栏:{}'.format("《MySQL DBA封神打怪之路》"))

#输出结果:订阅了CSDN某大佬的付费专栏:《MySQL DBA封神打怪之路》

image-20220805162931909

2)格式化规则中有两个占位符

当格式化规则中有多个占位符,且传递的字符串个数与占位符的个数相等时,format方法中传递的字符串会依次按照顺序替换掉格式化中的占位符。

hkhformat = '订阅了CSDN某大佬的付费专栏:{},价格为:{}'
sc = "《MySQL DBA封神打怪之路》"
price = 9.9
print(hkhformat.format(sc,price))

#输出结果:订阅了CSDN某大佬的付费专栏:《MySQL DBA封神打怪之路》,价格为:9.9

概念图可以参照上面的图片。

3.在占位符花括号中指定传递字符串的位置参数

在百分号占位符中,要求占位符的个数必须与要格式化的字符串个数相等,否则就无法格式化。

花括号占位符没有这个限制,当占位符有很多个时,字符串的个数无需与之相等,只需要在所有花括号占位符中指定某个字符串的位置号,使每个占位符都能被替换成实际的值,就可以成功格式化。

每个format中的字符串都有一个位置参数,第一个字符串为0,第二个字符串为1,依次类推。

hkhformat = '订阅了CSDN某大佬的付费专栏:{0},价格为:{1},未来三个月此专栏的价格为;{1}'
'''
	在格式化规则中,每个{}占位符里指定format传递的字符串的位置参数,指定之后对应位置参数的字符串就会和这个占位符进行替换。
	相当于是指定将format中的某个参数放在哪个占位符处。
'''
sc = "《MySQL DBA封神打怪之路》"
price = 9.9
print(hkhformat.format(sc,price))

#输出结果:订阅了CSDN某大佬的付费专栏:《MySQL DBA封神打怪之路》,价格为:9.9,未来三个月此专栏的价格为;9.9

image-20220805165154075

概念图如下所示:根据字符串的位置号,一次与指定位置号的占位符进行替换,最终格式化输出字符串。

image-20220805170353466

4.在占位符花括号中指定字符串关键字参数的名称

在上面我们在花括号占位符中指定了的是字符串的位置参数,还有另外一种方法,就是在format中为字符串设置一个关键字参数,然后在花括号占位符中指定字符串的关键字参数名称,也可以占位符与指定的字符串进行替换。

hkhformat = '订阅了CSDN某大佬的付费专栏:{s},价格为:{p},未来三个月此专栏的价格为;{p}'
'''
    此时在花括号占位符中引用的就不是位置参数了,而是format方法为字符串设置的关键参数名称,这个关键参数名称可以抽象理解为字符串的别名
'''
sc = "《MySQL DBA封神打怪之路》"
price = 9.9
'''
    在format函数中为传递的每个字符串设置一个关键参数,格式为:参数名=字符串
'''
print(hkhformat.format(s = sc, p = price))

#输出结果:订阅了CSDN某大佬的付费专栏:《MySQL DBA封神打怪之路》,价格为:9.9,未来三个月此专栏的价格为;9.9

image-20220805171430771

在format中为字符串设置的关键参数,可以抽象的认为是给字符串设置一个别名,例如字符串不是复制给变量的,而是直接在print中声明的。

hkhformat = '订阅了CSDN某大佬的付费专栏:{s},价格为:{p},未来三个月此专栏的价格为;{p}'
print(hkhformat.format(s = "《MySQL DBA封神打怪之路》", p = 9.9))

把关键字认为是字符串的别名或者是变量名,然后在花括号占位符中调用这个别名对应的字符串,更容易理解和学习。

5.在占位符花括号中还可以使用冒号指定整数的表示形式

在前面几个案例中,占位符{}里没有指定特殊参数,都是对字符串类型的数据进行格式化输出,除此之外,还可以在占位符花括号中使用冒号指定整数类型的表示形式,即对一个数字类型的数据根据指定的整数表示形式,从而进行格式化输出。

在花括号占位符中如果想对这个占位符声明一种特殊格式,那么就用冒号去定义。

常见的使用冒号指定整数类型的表示形式,有以下几个:

  • :d:将传入的整数类型的字符串格式化成十进制数。
  • :b:将传入的整数类型的字符串格式化成二进制数。
  • :o:将传入的整数类型的字符串个格式化成八进制数
  • :x:将传入的整数类型的字符串格式化成十六进制数,其中a~f是小写。
  • :X:将传入的整数类型的字符串格式化成十六进制数,其中a~f是大写。
  • :f:将传入的整数转换成浮点数。
  • :,:将传入的整数格式化成千位分隔符的数字。

当占位符中使用冒号指定整数的表示形式后,传入到这个占位符的字符串必须是整数类型,否则会抛出ValueError: Unknown format code 'b' for object of type 'str'的异常。

1)将传递的整数格式化成十进制数

print('传递的整数格式化成十进制数:{:d}'.format(95))

#输出结果:传递的整数格式化成十进制数:95

2)将传递的整数格式化成二进制数

print('传递的整数格式化二进制数:{:b}'.format(95))

#输出结果:传递的整数格式化二进制数:1011111

3)将传递的整数格式化成十六进制数(a~f为小写字母)

print('传递的整数格式化成十六进制数(a~f为小写字母):{:x}'.format(95))

#输出结果:传递的整数格式化成十六进制数(a~f为小写字母):5f

4)将传递的整数格式化成十六进制数(a~f为大写字母)

print('传递的整数格式化成十六进制数(a~f为大写字母):{:X}'.format(95))

#输出结果:传递的整数格式化成十六进制数(a~f为大写字母):5F

5)将传递的整数格式化成八进制数

print('传递的整数格式化成八进制数:{:o}'.format(95))

#输出结果:传递的整数格式化成八进制数:137

6)将传递的整数格式化成浮点数

print('传递的整数格式化成浮点数:{:f}'.format(95))

#输出结果:传递的整数格式化成浮点数:95.000000

7)将传递的整数格式化成千位分隔符的科学数字

print('传递的整数格式化成千位分隔符的科学数字:{:,}'.format(10086111))

#输出结果:传递的整数格式化成千位分隔符的科学数字:10,086,111

image-20220806223941656

在上面的案例中,花括号占位符中虽然使用冒号指定了整数的表示形式(进制),{:x}这样的占位符只是指定了特殊的处理参数,其实就相当于{},并没有指定其他的参数,像前面说到的位置参数、关键字参数也可以在{:x}带有特殊参数的占位符中指定。

字符串的位置参数和关键字参数名称需要定义在:冒号的左侧。

#在占位符中使用字符串的位置参数以及冒号参数
intformat = '传递的整数格式化成十进制数:{0:d}\n传递的整数格式化成八进制数:{1:o}'
print(intformat.format(95, 97))

#在占位符中使用字符串的关键字参数以及冒号参数
intformat = '传递的整数格式化成十进制数:{sjz:d}\n传递的整数格式化成八进制数:{bjz:o}'
print(intformat.format(sjz = 95, bjz = 97))

image-20220806224556441

另外在一个格式化表达式规则中,字符串的位置参数和关键字参数可以同时使用,即一个占位符使用位置参数找到特定的传递字符串,另一个占位符使用关键字参数找到特定的传递字符串。

intformat = '传递的整数格式化成十进制数:{0:d}\n传递的整数格式化成八进制数:{bjz:o}'
print(intformat.format(95, bjz = 97))

概念图如下,指定位置参数的占位符,根据位置参数找到对应的字符串,指定关键字参数的占位符,根据关键字参数找到对应的字符串,互不影响。

image-20220806225305126

6.在占位符花括号中还可以使用冒号指定宽度和精度

在使用%作为占位符时,就实现了宽度和精度的自定义,花括号占位符比百分号占位符的功能更加强大,因此宽度和精度在花括号占位符中也可以使用。

宽度、精度在花括号占位符中的使用相较于百分号占位符,没有任何区别,只不过花括号占位符定义宽度后,字符串是左对齐(左侧填补空格),数字是右对齐(右侧填补空格)。

1)在花括号占位符中使用宽度

宽度的语法格式:{:宽度}

#数字类型是右对齐
print('数字类型的宽度:{:10}'.format(88))
#输出结果:数字类型的宽度:        88

#字符串类型是左对齐
print('字符串类型的宽度:{:15}'.format("jiangxl"))
#输出结果:字符串类型的宽度:jiangxl        

image-20220806231111172

使用冒号指定宽度参数后,还可以再占位符中指定字符串的位置参数或者关键字参数,当format中定义了多个字符串时,将指定的字符串传递到某个占位符中。语法格式:{位置参数/关键字参数:宽度}

kdformat = '宽度为10:{0:10},宽度为15:{zfc:15}'
print(kdformat.format(88,zfc="jiangxl"))

#输出结果:宽度为10:        88,宽度为15:jiangxl

image-20220806231715668

2)在花括号占位符中使用精度

精度的语法格式:{:.精度}

#使用精度将传递的浮点数总共只输出3位
print('浮点数规定只输出3位:{:.3}'.format(3.1415927))
#输出结果:浮点数规定只输出3位:3.14

#使用精度将传递的浮点数保留小数点后3位
print('浮点数保留小数点后3位:{:.3f}'.format(3.1415927))
#输出结果:浮点数保留小数点后3位:3.142

#使用精度将传递的字符串截取前5个字符
print('截取前5个字符:{:.5}'.format("jiangxl"))
#输出结果:截取前5个字符:jiang

image-20220806232843349

使用冒号定义精度后,也可以再指定字符串的位置参数和关键字参数。语法格式:{位置参数/关键字参数:精度}

jdformat = '精度为3:{0:.3f},精度为5:{zfc:.5}'
print(jdformat.format(3.1415926, zfc="jiangxl"))

#输出结果:精度为3:3.142,精度为5:jiang

image-20220806232820637

3)在花括号占位符中同时指定宽度和精度

同时指定宽度和精度的语法:{:宽度.精度}

print('同时指定宽度和精度:{:10.3}'.format(3.1415926))

#输出结果:同时指定宽度和精度:      3.14

image-20220806233244647

7.占位符花括号中的冒号还可以指定其他格式

在花括号占位符中,使用冒号除了指定整数的转换类型、宽度、精度外,还可以指定其他的格式,根据这个格式对字符串进行格式化,例如就可以使用冒号实现前面用百分号占位符格式化的日期格式。

一个花括号中使用一个冒号指定格式即可。

只要是声明时间类型的整数,就需要使用到datetime包中的datetime类。

from datetime import datetime
print('日期:{:%Y-%m-%d %H:%M:%S}'.format(datetime(2022,8,6,23,35,10)))

image-20220806233805155

8.format方法和format函数

使用花括号占位符时,字符串是通过format方法传递的,当然也能通过format函数来实现。

format方法和format函数对于字符串的传递、输出格式化后的字符串效果是相同的。

format函数的使用语法:format(传递的字符串, 占位符中的格式)

{:b}.format(n)   等同于   format(n, 'b')

使用format方法的代码如下:

print('传递的整数格式化二进制数:{:b}'.format(95))

还成format函数的代码将有所变化:

print(format(95, 'b'))

#输出结果:101111

image-20220806235426370

二者也是有非常大的区别的,format方法可以配合花括号占位符对字符串进行任意的格式化输出,但是format函数是将花括号占位符中的参数传递给了format函数,且不能任意声明一个格式化规则,只能在format函数的第二个参数中声明花括号占位符的参数,使用不是很人性化。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月2日 下午10:48
下一篇 2023年3月2日 下午10:50

相关推荐