2018-02-21-Python下单格式化输出

前言

用python上某浴谷oj刷题,然后在格式化输出炸了

字符串拼接大法不能设置左对齐右对齐和小数后补齐,然后思考了好久的人生

然后用c++的格式化占位符试了一下妈耶竟然可以用,真棒

顺便科普了一下format函数的奇怪姿势【为什么不原版照搬抄c++呢?】

正文

格式化占位符表

表格镇楼,C++格式化就不说了oi永远的痛啊【为什么用cout就没有pout呢??】

占位符 类型
%s 字符串 (采用str()的显示)
%r 字符串 (采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)�或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
%% 字符"%"

可以参考这篇格式化输出的文章,printf的表达式格式如下:

%[(name)][flags][width].[precision]typecode

(name)为命名
flags可以有+,-,' '或0。+表示右对齐。-表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。
width表示显示宽度
precision表示小数点后精度

所以使用熟悉的c++语法书写一下

print("%+10x" % 10)
print("%04d" % 5)
print("%6.3f" % 2.3)

别忘了别加; 你不是在做NOI醒醒

所以只要记住上面的表格基本上就可以笑傲江湖了
可是如果我不想记呢?

模板输出

模板输出其实是利用了一个字典来进行输出,在格式化表格式里面填key,然后连接到字典里面
这就跟markdown插入超链接的方法有点像

[name][1]
[1]:URL

使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。

python中也自带解析器,如下:

str = "%s大大写的blog真tm好看" % ('Max')
print(str)

或者可以写成另外一种形式,直接在print里面写字符串

print("%s大大写的blog真tm好看" % ('Max'))

注意格式符的顺序,不要把数字写到名字上面去了【我曾经因为这个掉了100分】【谁叫你不用cout?】

我们还可以使用字典的key来代替格式占位符,如下:

print("%(name)今年%(age)岁了,而且%(name)永远不会老去" % {'name':江边沼泽淹死村民', 'age':92})

可以看到,我们对两个格式符进行了命名。命名使用()括起来。每个命名对应词典的一个key。
这种可以写多个一样的key,不需要一个一个可怜的拼接

format 函数

加强版print辅助函数

In [1]: '{0},{1}'.format('kzc',18)  
Out[1]: 'kzc,18'  
In [2]: '{},{}'.format('kzc',18)  
Out[2]: 'kzc,18'  
In [3]: '{1},{0},{1}'.format('kzc',18)  
Out[3]: '18,kzc,18'

像上面格式化一样写进print里面就行了,这个是通过映射进行关键字输出,不对不对是下标输出的实例

也可以通过字典输出,如下

In [5]: '{name},{age}'.format(age=18,name='kzc')  
Out[5]: 'kzc,18'

可以观察到带字典的format可以交换key所对应的值
也就是说format用字典和格式化表达式位置可以不按照顺序写

字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以。
通过关键字参数

通过class使用format函数

class Person:  
    def __init__(self,name,age):  
        self.name,self.age = name,age  
        def __str__(self):  
            return 'This guy is {self.name},is {self.age} old'.format(self=self)  
In [2]: str(Person('kzc',18))  
Out[2]: 'This guy is kzc,is 18 old'

这个我一般不用,等会儿class写炸了你就爽歪歪了

通过下标

通过下标

In [7]: p=['kzc',18]
In [8]: '{0[0]},{0[1]}'.format(p)
Out[8]: 'kzc,18'

直接写在print里面,以前认为是最简正解了,然后直到我发现可疑扔字典到里面

PS:神奇的金额分隔符参考一下

In [47]: '{:,}'.format(1234567890)
Out[47]: '1,234,567,890'

format的其他

其他类型
主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。
如下,数字为17,在不同的进制下的输出

In [54]: '{:b}'.format(17)
Out[54]: '10001'
In [55]: '{:d}'.format(17)
Out[55]: '17'
In [56]: '{:o}'.format(17)
Out[56]: '21'
In [57]: '{:x}'.format(17)
Out[57]: '11'

最后

emmmmmmm在信息课上写的哈哈哈哈
参考:
飘逸的python - 增强的格式化字符串format函数
字符串:南京大学用python玩转数据

最后的最后

来Max的博客点星星吧~

你可能感兴趣的:(2018-02-21-Python下单格式化输出)