python输出format_python格式化字符输出 str.format()|python基础教程|python入门|python教程...

本文详细介绍了Python 3.6中str.format()和f-string的使用,通过实例演示如何创建对齐的表格,对比了两者在格式化字符串和代码简洁性的优势,特别关注了str.format()的灵活性和f-string的简洁特性。
摘要由CSDN通过智能技术生成

需求分析

字符串格式化是编程常见操作,python中也对此有强大的支持。python3.6中有利用%和str.format()来操作的,python3.6也新增了f-string的方法。本文简单讲解str.format(),通过其绘制一个简单表格。如下图

10610675-ec46404c74b832c9.png

看起来还算不错吧

下面是一些原数据,三个列表。

label = ['TP', 'FN', 'FP','TN', 'Sn/RE(%)', 'Sp(%)', 'Acc', 'Mcc', 'PPV/PR(%)', 'Str(%)', 'FPR(%)']

data1 = ['209', '43', '25', '227', '82.9365%', '90.0794%', '86.5079%', '73.2029%', '89.3162%', '86.5079%', '9.9206%']

data2 = ['227', '25', '43', '209', '90.0794%', '82.9365%', '86.5079%', '73.2029%', '84.0741%', '86.5079%', '17.0635%']

利用 ' '.join()

不知道格式化字符串的话,可能会通过下面代码实现来输出数据:

for i in [label, data1, data2]:

print(' '.join(i)) # join()

上面的代码可能会造成下面的现象,没有对齐。

10610675-c133122336648457.png

没对齐的表格

有的会想是因为label数据和data的数据长度不一样,调一下相隔的宽度就行。' '.join() 这个是固定的,调节' '的大小,列表所有元素相邻间隔就变动了,要找到一个合适的间隔不太容易。

% 方法

接触过格式化字符串的话,可能先想到的是 %。上面代码改为

for i in [label, data1, data2]:

s = '%s %s %s %s %s %s %s %s %s %s %s'%(i[0],i[1],i[2]...i[10])#偷懒,明白就好

print(s)

然后结果是这样:

10610675-24bd9ebbea5780ea.png

还是不对齐

你看了看,这不是join()函数,这是利用 % 可以自由更改它们之间的间距,然后你修改了代码:

for v,i in enumerate([label, num1, num2]):

if v == 10:

s = '%s %s %s %s %s %s %s %s %s %s %s'%(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10])

else:

s = '%s %s %s %s %s %s %s %s %s %s %s'%(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10])

print(s)

结果很不错,他们已经对齐了:

10610675-203abed4bee52deb.png

成功了

但是,过程确实不容易,且不说%后面的跟着的一长串字符,不能利用拆包,只能一个萝卜一个坑的对应这放进去,容易出现小失误。接下来介绍str.format()就比这优雅。不过我觉得新手应该比较喜欢用%吧,,因为这比str.format()少打一个单词。。。

str.format()

直接上代码了

直接这样和利用%是一样的

str_f = '{} {} {} {} {} {} {} {} {} {} {}'

#加索引,和上面不加就本例子来说,效果差不多。不过加了能加清楚有多少个,和有其它用途)

#str_f = '{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}'

for i in [label, data1, data2]:

print(str_f.format(*i))

#继续改进

str_f1 = '{:^8} {:^8} {:^8} {:^8} {:^8} {:^8} {:^8} {:^8} | {:^9} {:^8} | {:^8}'

for i in [label, data1, data2]:

print(str_f1.format(*i))

#这个你会发现,前四个数字用不了那么大的间距,继续修改代码。

print('-'*116)

str_f2 = '{:^4} | {:^4} | {:^4} | {:^4} | {:^8} | {:^8} | {:^8} | {:^8} | {:^9} | {:^8} | {:^8}'

for i in [label, data1, data2]:

print(str_f2.format(*i))

print('-'*116)

10610675-f65bfa8f2e494265.png

效果

下面是{}里面的一些格式说明符。

#摘自python官方文档

format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]

fill ::=

align ::= "<" | ">" | "=" | "^"

sign ::= "+" | "-" | " "

width ::= integer

precision ::= integer

type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

主要讲解下文本所用到的格式说明符,'{}'就像excel里的单元格,不过这里的{}与{}之间可以设置不同字符如,'{} {}';align就像是单元格居中(…^),居左(<)还是居中(>)。width是单元格的宽度,在实际中就是根据字符的长度可以设置不同的宽度。本文中就分别设置了4,8。fill 是填充物,将单元格剩余空格填充指定字符,sign是指定数字前的符号(+,-),precision是数字精度长度。type,数据类型。(%也有上述差不多的功能,不过之前未曾提及。感兴趣,请上网搜索)

还有个值得提的是str.format()里的参数支持拆包,从上面代码可以看出不用像%那样将每个元素都写出来了。

f-string

f-string是python3.6新增的,此处简要只写相关代码。

#打印出来效果和上面str_f1差不多。

for i in [label, data1, data2]:

a = ' | '.join([f"{a:{9}}" for a in (i)])

fs = f'{a}'

print(fs)

加几个官方例子:

>>> value = 4 * 20

>>> f'The value is{value}.'

'The value is 80.'

>>> f'{{{4*10}}}'

'{ 40 }'

>>> f'{{{4*10}}}'

'{40}'

>>> def foo():

... return 20

...

>>> f'result={foo()}'

'result=20'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值