format函数的调用
format函数可以被直接调用或在print函数中以占位符实现格式化调用。
在**2.6**版本前,占位符仍和其他语言一样使用%(比如C中)。但在其后的版本,format函数的占位符更改为{}(花括号)。
优化的目的目前总结出了4个:
1.花括号封闭可以实现更多格式化的实现,更强大的功能
2.使代码具有更强的可读性。
3.单个参数可以多次输出,参数顺序可以不相同
4.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型
好了,进入正文,对于format函数的使用将分为两部分。
1.format函数及其占位符的调用格式
2.占位符格式和参数设定
ps:在介绍的时候各个内容会有小小的穿插,其实是为了更加便于理解~
format函数及其占位符的调用格式
format函数可以直接被调用,比如在shell中直接调用
例1
1
2
3
4
5
6
|
>>> '{} {}' . format ( 'hello' , 'world' ) #占位符不指定顺序 'hello world' >>> '{0} {1}' . format ( 'hello' , 'world' ) #占位符制定顺序 'hello world' >>> '{1} {0}' . format ( 'hello' , 'world' ) #换一下顺序试试 'world hello' |
我们更常用的方式是放入print()函数中进行格式化输出
例2
1
2
3
|
print ( '{}获得了S8冠军' . format ( 'IG' ) #结果: #IG获得了S8冠军 |
占位符以及参数设定
在第一部分中,简单地介绍了两种调用format函数的方式。可以很清晰地发现,在占位符中也可以输入一些参数,对格式化输出的参数进行设定,下面就详细的介绍占位符中各项参数的顺序和设置。
占位符中的各项参数格式如下所示
例3(伪代码)
1
|
'{position/key:fill,align,sign,width,precision,type}' . format (...) |
position/key
position/key指定了占位符处从format函数的参数中调用哪个值,position很好理解,比如上面例1中介绍的后两种调用,就指定了format中两个参数hello和world在占位符中调用的顺序,注意这个顺序是按照数组排序中从‘0'开始计算的。 当然,你也可以使用键值对进行操作。比如下面的例4:
例4
1
2
3
|
print ( 'the championship of the S8 is {S8}, and for S9, it\'s {S9}.' . format (S8 = 'IG' ,S9 = 'FPX' )) #结果:the championship of the S8 is IG, and for S9, it'FPX. |
有写小伙伴可能要问了,键值对(字典)的使用在这里有什么好处吗?感觉还不如填个数字来的快捷啊?
再来看下面这一段代码:
例5:
1
2
3
4
|
dic = { 'S8' : 'IG' , 'S9' : 'FPX' } print ( 'the championship of the S8 is {S8}, and for S9, it\'s {S9}.' . format ( * * dic)) #结果:the championship of the S8 is IG, and for S9, it'FPX. |
在例5中,有些需要特别说明的地方,首先如果你要在format的括号里调用字典,记得在字典名前面加**,也就是字典的函数调用方法哦!从例5中应该能发现了,我们不需要在format中专门把字典列出来,而是可以调用以前定义过的字典,这就使得其具备了重复调用的优点。想象一下这一点会有什么不同,这是%方法做不到的哦。
你也可以用数组的形式填充,如例6所示:
例6:
1
2
3
4
5
|
names = [ 'hilary' , 'vergil' , 'nero' ] places = [ 'chengdu' , 'shijiazhuang' , 'tokyo' ] print ( 'Hi, {names[0]}. I am {names[1]} and this is {names[2]}.' . format (names = names) #Hi, hilary. I am vergil and this is nero. |
第一个位置的参数,也是冒号前唯一的参数相信大家就搞明白啦。
下面的参数都是并列的,我们一个一个说明。首先要讲清楚这些参数如何并列或分隔。
那就是无需分隔,没错,下面的这些参数,你需要定义哪些就按照顺序写下就行,不用加什么逗号或者空格分开,你可能会想,这不容易产生歧义吗?我学习的时候也想过这个问题,事实是开发者编辑函数逻辑时就吧这些参数的设定值用不会产生任何歧义的符号或数字组合起来了,这一点当你使用时也会发现。
fill参数
fill参数用于指定填充符,默认值为空格,实际经验是,很少有场景会用到这个参数,除非是按照国际通用的三位一个逗号分隔数字等场景。
例7:
1
2
|
>>> print ( '{:,}' . format ( 12345678 )) 12 , 345 , 678 |
align参数
align参数用于格式化文本的对齐方式,当你填充了宽度的时候,这个参数的作用是很大的,当然,在一句话中无缝的插入一个格式化文本的话,这个参数的设置就不大有意义了。
> | < | ^ |
右对齐 | 左对齐 | 居中对齐 |
例8:
在shell中运行如下代码(代码中数字三十表示宽度,目的是为了拉大总体宽度显示出对齐的效果,后文会提到宽度的使用方法)
1
2
3
4
5
6
|
>>> print ( '{:<30}' . format ( 'pos' )) pos >>> print ( '{:>30}' . format ( 'pos' )) pos >>> print ( '{:^30}' . format ( 'pos' )) pos |
sign参数
sign参数用于指定是否保留正负号,这个针对format中数字起作用。
+ | - | SPACE |
保留正负号 | 仅保留负号 | 正数留空,负数保留负号 |
例9:
1
2
3
4
|
>>> print ( '{0:+} {0:-} {0: }' . format ( 123 )) + 123 123 123 >>> print ( '{0:+} {0:-} {0: }' . format ( - 123 )) - 123 - 123 - 123 |
ps:注意第一行代码运行结果中最后一个保留了一个空格哦
width参数
width参数控制输出的长度,经过我的测试,该长度为最小长度,即当设定的width参数小于format中调用的值时,不生效;而当设定值大时,会用空格(默认)或零进行填补,如果想要用0进行填补,那么需要在width前添加0,width参数的使用如例10所示。在例8中展示对齐参数时也使用了宽度参数,可以看出对齐是对我们的填补方式存在影响,其具体影响也在例10中给出。
例10:
1
2
3
4
5
6
7
8
9
|
print ( '{0:12} {0:05} {0:2}' . format ( 123 )) #依次为12位宽空格填补、5位宽0填补、2位宽 #结果: # 123 00123 123 print ( '{0:<012},{0:>012},{0:^012} ' . format ( 123 )) #结果: #123000000000,000000000123,000012300000 print ( '{0:^012},{1:^012},{0:^011},{1:^011} ' . format ( 123 , 1234 )) #结果: #000012300000,000012340000,00001230000,00012340000 |
可以看出空格的填补同样以对齐的区别显示出来,但是0的填补却往往改变了我们数字的表示,使用时要注意。另一个要注意的是当你的总宽度和数据的有效宽度的奇偶性不同时,居中对齐的方式会有不同,这就是例10中第三行代码希望表达的意思。可以看出,当奇偶次出现不同时,总是偏向左一位对齐。
precision参数
和%方法中一样,如%.3f表示保留小数点三位小数,用【.保留有效数字位数(f)】表示数据的精确度,如果添加f,则表明保留的为小数点后位数,如果不加,则表示保留的是有效数字位数。例11很好的展示了这种区别。
例11:
1
2
3
|
print ( '{0:.2f},{0:.7f},{0:.2},{0:.2%} ' . format ( 123.123456789 )) #结果: #123.12,123.1234568,1.2e+02,12312.35% |
其实小伙伴们应该注意到了,这里的f,%其实都算是precision参数后的type参数控制的内容——数据类型。因此,我们对精度简单介绍,而将precision-type参数的联合参数具体介绍,因为二者具有很强的关联。
precision-type参数
首先介绍所有的type参数,如下表所示:
type参数 | 含义 | 例 | |
---|---|---|---|
默认 | 十进制整数 | 123 | |
f | 浮点数 | 123.123 | |
% | 百分比格式 | 12312.3% | |
e | 指数形式 | 1.2e01 | |
- | d | 十进制整数 | 123 |
进制转换 | 十进制 | 123 | |
b | 二进制 | 1101111 | |
o | 八进制 | 157 | |
x | 十六进制 | 6f | |
#x | 小写表示的十六进制 | 0x6f | |
#X | 大写表示的十六进制 | 0X6F | |
c | 字符,打印前转换为Unicode代码 | ‘123' |
本文由学习总结而成,引用了一段代码,文章中有引用号,引用链接放在下面:
http://www.zzvips.com/article/224864.html
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/m0_46164535/article/details/120960933