文章目录
在前面我们说了使用百分号作为占位符,对字符串进行格式化,较为简单,下面使用花括号作为占位符对字符串进行格式化,稍微有些复杂。
使用花括号作为占位符的应用非常普遍,主要在于其非常灵活以及功能强大。
1.使用百分号作为占位符的概念
使用花括号作为占位符,格式化指定字符串时需要调用format方法传递字符串,才可以对字符串进行格式化输出,语法格式如下:
print('格式 {}'.format(字符串))
花括号作为占位符的格式化原理和百分号作为占位符的格式化原理,大差不差,字符串的实际值在格式化时,就会替换占位符,从而带着格式输出格式化后的内容。
如下所示,在格式化的格式规则中,占位符用花括号{}表示,然后调用format方法传递字符串,要用格式规则去调用format函数,当有多个占位符时,format中的字符串按照顺序依次替换占位符。
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封神打怪之路》
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
概念图如下所示:根据字符串的位置号,一次与指定位置号的占位符进行替换,最终格式化输出字符串。
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
在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
在上面的案例中,花括号占位符中虽然使用冒号指定了整数的表示形式(进制),{: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))
另外在一个格式化表达式规则中,字符串的位置参数和关键字参数可以同时使用,即一个占位符使用位置参数找到特定的传递字符串,另一个占位符使用关键字参数找到特定的传递字符串。
intformat = '传递的整数格式化成十进制数:{0:d}\n传递的整数格式化成八进制数:{bjz:o}'
print(intformat.format(95, bjz = 97))
概念图如下,指定位置参数的占位符,根据位置参数找到对应的字符串,指定关键字参数的占位符,根据关键字参数找到对应的字符串,互不影响。
6.在占位符花括号中还可以使用冒号指定宽度和精度
在使用%作为占位符时,就实现了宽度和精度的自定义,花括号占位符比百分号占位符的功能更加强大,因此宽度和精度在花括号占位符中也可以使用。
宽度、精度在花括号占位符中的使用相较于百分号占位符,没有任何区别,只不过花括号占位符定义宽度后,字符串是左对齐(左侧填补空格),数字是右对齐(右侧填补空格)。
1)在花括号占位符中使用宽度
宽度的语法格式:{:宽度}
#数字类型是右对齐
print('数字类型的宽度:{:10}'.format(88))
#输出结果:数字类型的宽度: 88
#字符串类型是左对齐
print('字符串类型的宽度:{:15}'.format("jiangxl"))
#输出结果:字符串类型的宽度:jiangxl
使用冒号指定宽度参数后,还可以再占位符中指定字符串的位置参数或者关键字参数,当format中定义了多个字符串时,将指定的字符串传递到某个占位符中。语法格式:{位置参数/关键字参数:宽度}
kdformat = '宽度为10:{0:10},宽度为15:{zfc:15}'
print(kdformat.format(88,zfc="jiangxl"))
#输出结果:宽度为10: 88,宽度为15:jiangxl
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
使用冒号定义精度后,也可以再指定字符串的位置参数和关键字参数。语法格式:{位置参数/关键字参数:精度}
jdformat = '精度为3:{0:.3f},精度为5:{zfc:.5}'
print(jdformat.format(3.1415926, zfc="jiangxl"))
#输出结果:精度为3:3.142,精度为5:jiang
3)在花括号占位符中同时指定宽度和精度
同时指定宽度和精度的语法:{:宽度.精度}
print('同时指定宽度和精度:{:10.3}'.format(3.1415926))
#输出结果:同时指定宽度和精度: 3.14
7.占位符花括号中的冒号还可以指定其他格式
在花括号占位符中,使用冒号除了指定整数的转换类型、宽度、精度外,还可以指定其他的格式,根据这个格式对字符串进行格式化,例如就可以使用冒号实现前面用百分号占位符格式化的日期格式。
一个花括号中使用一个冒号指定格式即可。
只要是声明时间类型的整数,就需要使用到datetime包中的datetime类。
from datetime import datetime
print('日期:{:%Y-%m-%d %H:%M:%S}'.format(datetime(2022,8,6,23,35,10)))
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
二者也是有非常大的区别的,format方法可以配合花括号占位符对字符串进行任意的格式化输出,但是format函数是将花括号占位符中的参数传递给了format函数,且不能任意声明一个格式化规则,只能在format函数的第二个参数中声明花括号占位符的参数,使用不是很人性化。
文章出处登录后可见!