前言
用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玩转数据
网友评论