美文网首页
2018-02-21-Python下单格式化输出

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

作者: 0xC00005 | 来源:发表于2018-02-23 01:51 被阅读0次

    前言

    用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下单格式化输出

          本文链接:https://www.haomeiwen.com/subject/igratftx.html