【Python扫盲】字符串格式化

作者: nanarino | 来源:发表于2020-05-06 12:24 被阅读0次

    字符串格式化

    Python的字符串格式化有两种方式

    • %格式符方式
    • format方式

    事实上,格式化借助的是对象的魔术方法。

    实现了__format__的对象才适用于format方式格式化输出,

    实现了__str____repe__的对象才分别适用于格式符%s%r输出。

    %格式符

    一般格式为 %(name) + format_spec

    [[fill]align][sign][#][0][width][grouping_option][.precision][type]
    

    name

    可选,用于选择指定的key

    >>> "%(name)s——%(age)d"%{'name':'宝钟玛琳','age':17}
    '宝钟玛琳——17'
    

    s 和 d 属于 [type]

    format_spec规则的常用组分:

    sign

    可选,数字和字符串可供选择的值有:

    • + 右对齐;正数负数前加正负号
    • - 左对齐;负数前加负号
    • 空格 右对齐;负数前加负号
    • 0 右对齐;正数前无符号,负数前加负号;用0填充空白处

    width

    可选,占有宽度

    >>> "%(name)+7s——%(age)-5d"%{'name':'宝钟玛琳','age':17}
    '   宝钟玛琳——17   '
    

    .precision

    可选,小数点后保留的位数 默认6位

    type

    类型,必选

    任意对象:

    • %s 字符串 (采用str()的显示)

    • %r 字符串 (采用repr()的显示)

    • %c 单个字符

    字符串和整数:

    • %b 二进制整数
    • %% 字符"%"转义

    数字:

    • %d 十进制整数
    • %i 十进制整数
    • %o 八进制整数
    • %x 十六进制整数
    • %e 指数 (基底写为e)
    • %E 指数 (基底写为E)
    • %f 浮点数
    • %F 浮点数,与上相同
    • %g 科学计数法(e)或浮点数 (根据显示长度)
    • %G 科学计数法(E)或浮点数 (根据显示长度)
    • %% 字符"%"
    >>> '——%(p).2f'%{'p':0.1+0.2}
    '——0.30'
    >>> '——%(p).2g'%{'p':0.1+0.2}
    '——0.3'
    

    终端字体颜色

    """
    #格式:
      设置颜色开始 :\033[显示方式;前景色;背景色m
      
    #说明:
    前景色            背景色           颜色
    ---------------------------------------
    30                40              黑色
    31                41              红色
    32                42              绿色
    33                43              黃色
    34                44              蓝色
    35                45              紫红色
    36                46              青蓝色
    37                47              白色
    
    显示方式           意义
    -------------------------
    0                终端默认设置
    1                高亮显示
    4                使用下划线
    5                闪烁
    7                反白显示
    8                不可见
    """
    
    #例子:
    \033[1;31;40m    #1-高亮显示 31-前景色红色  40-背景色黑色
    \033[0m          #采用终端默认设置,即取消颜色设置
    

    可以使用第三方模块termcolor来简化语句:

    from termcolor import colored
    
    print(colored("helloworld", "red"))
    

    第三方模块在使用前需要用pip安装

    系统支持

    Windows7及以下无法解析颜色代码
    使用termcolor模块也无效
    可以使用第三方模块colorama来显示颜色

    colorama模块兼容更好:

    from colorama import  init, Fore
    
    init(autoreset=False) #给True的时候print时无需+Fore.RESET
    print(Fore.RED + "helloworld" + Fore.RESET)
    

    内置函数format()

    内置函数format(value[, format_spec])

    第二个参数即format_spec格式规格迷你语言

    实现了魔术方法__format__的对象都可以使用

    以数字对象的格式化为例:

    >>> format(12,'+.3f') #保留3位小数
    '+12.000'
    >>> format(3,'b') #二进制转化
    '11'
    

    其他实现了魔术方法__format__的对象,这里以datetime.time对象为例:

    >>> night = datetime.time(22,30,tzinfo=datetime.timezone(
    ...     datetime.timedelta(hours=8), name = '北京'))
    >>> format(night,'现在是%Z时间%H点%M分')
    '现在是北京时间22点30分'
    

    str.format()

    ' {}  {}  {} '.format(a,b,c)     
    ' {0}  {1}  {2} '.format(a,b,c)
    ' {0}  {1}  {2} '.format(*[a,b,c])
    ' {a}  {b}  {c} '.format(a=a,b=b,c=c)
    ' {a}  {b}  {c} '.format(**{"a":a,"b":b,"c":c})
    

    {!s}是默认的

    '{!s}、{!a}、{!r}' #分别表示str、ascii和repr方法。
    

    实现了魔术方法__format__的对象可以使用冒号 : format_spec

    >>> '0x{:x}'.format(255)
    '0xff'
    

    datetime.time对象为例的其他实现了魔术方法__format__的对象:

    >>> '现在是{:%Z}时间{:%H}点{:%M}分'.format(night,night,night)
    '现在是北京时间22点30分'
    

    f字符串

    在python3.6以上,str.format()可以直接使用f字符串的写法

    f'{a}{b}{c}'即可代替'{a}{b}{c}'.format(a=a,b=b,c=c)

    f字符串中不允许使用\转义字符。

    datetime.time对象为例的其他实现了魔术方法__format__的对象:

    >>> f'现在是{night:%Z}时间{night:%H}点{night:%M}分'
    '现在是北京时间22点30分'
    

    在python3.8以上

    f字符串中可以直接使用说明符=调试,

    >>> python = 3.8    
    >>> f"{python=}"    
    'python=3.8'
    

    内置函数str()repr()

    str()不止是构造函数(class)实例化一个str对象,

    str(o)它也是对参数对象进行魔术方法的调用:o.__str__(),将参数转换为了str对象

    无论是print(o)f'{o}', "%s"%o,它们都是对魔术方法 o.__str__()的调用


    repr(o)f'{o!r}', "%r"%o则是对魔术方法 o.__repr__()的调用,

    它会以字面量的形式呈现对象,即字符串带有引号,列表变成'['+ repr(成员) + ',]'

    f字符串f'{o=}'就相当于f'o={repr(o)}'

    相关文章

      网友评论

        本文标题:【Python扫盲】字符串格式化

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