精细化Python-字符串格式化

 1、概述

    在Python中,字符串属于不可变有序序列,使用单引号、双引号、三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套

    Python支持字节串类型bytes,str类型字符串可以通过encode()方法使用指定的字符串编码格式编码成为bytes对象,而bytes对象则可以通过decode()方法使用指定编码格式解码成为str字符串。

    Python 3.x完全支持中文字符,默认使用UTF8编码格式,无论是一个数字、英文字母,还是一个汉字(无论汉字的编码是二字节三字节或四字节),在统计字符串长度时都按一个字符对待和处理。

         转义字符

转义字符

含义

转义字符

含义

\b

退格,把光标移动到前一列位置

\\

一个斜线\

\f

换页符

\’

单引号’

\n

换行符

\”

双引号”

\r

回车

\ooo

3位八进制数对应的字符

\t

水平制表符

\xhh

2位十六进制数对应的字符

\v

垂直制表符

\uhhhh

4位十六进制数表示的Unicode字符

         在字符串前面加上字母 r 或 R 表示原始字符串,其中的所有字符都表示原始的含义而不会进行任何转义。

    2、格式化

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

     ①使用%运算符进行格式化

    '%[(name)][flags][width].[precision]typecode'%(表达式)

    (name)为命名

    flags可以有+,-,' '或0。+表示正数添加‘+‘号。-表示负对齐(字符串正对齐为左,数值正对齐为右)。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。

    width表示显示宽度

    precision表示小数点后精度

                 常用格式字符typecode

    ②使用format方法进行格式化

    1)format基本用法

  • -  不带编号----    {}
  • -  带数字编号,可调换顺序 {0},{1},{2}...
  • -  带关键字,{name},{age}....

  >>> print('My name is {},age:{}'.format('CDS',19))

  My name is CDS,age:19

  >>> print('My name is {1},age:{0}'.format(20,'CDS',19))

  My name is CDS,age:20

  >>> print('My name is {name},age:{age}'.format(classname='ji1',name='CDS',age=19,chinese=122))

  My name is CDS,age:19

    2)format的进阶用法

  • a·        <(默认)左对齐,> 右对齐,^中间对齐
  • b·        取位数“{:4s}”,“{:.2f}“    #可与a 中格式联合
  • %   _    ,  财务格式:百分比、分隔符等  #Python 3.6.0及更高版本支持且不与其他格式混合,当为int时,可连接数字进制格式 如 d,o,x等,当为float时,可连接 .nf        

  >>> print('{0:^10.3f}'.format(1/3))         #保留3位小数,且居中对齐,0可不写

  0.333

  >>> ‘{:%}’.format(3.5)                  #格式化为百分数

  '350.000000%'

  >>> ‘{:.2%}’.format(1/3)                 #转换为百分比,且保留两位小数

  '33.33%‘

  >>> '{0:_},{0:_x}'.format(1000000)       #Python 3.6.0及更高版本支持

  '1_000_000,f_4240'

  >>> ‘{0:,}16进制是{0:_x}'.format(10000000)      #Python 3.6.0及更高版本支持

  '10,000,000 16进制是98_9680'

        format格式也可赋值给变量,如: 

  weather = [("Monday","rainy"),("Tuesday","sunny"),  ("Wednesday", "sunny"),

    ("Thursday","rainy"), ("Friday","cloudy")]

  formatter = "Weather of '{0[0]}' is '{0[1]}'".format

  for item in map(formatter,weather):

        print(item)

       这个for循环也可写成如下

  for item in weather:

        print(formatter(item))

  运行结果:

  Weather of 'Monday' is 'rainy'

  Weather of 'Tuesday' is 'sunny'

  Weather of 'Wednesday' is 'sunny'

  Weather of 'Thursday' is 'rainy'

  Weather of 'Friday' is 'cloudy'

   ③格式化的字符串常量 f-string

  • 从Python 3.6.x开始支持一种新的字符串格式化方式,在字符串前加字母f,含义与字符串对象format()方法类似。

  >>> name = 'Cheng'

  >>> age = 29

  >>>height=1.75

  >>> f'My name is {name}, and I am {age} years old. My height is {height} m'

  'My name is Cheng, and I am 29 years old. My height is 1.75 m'

  >>> print(f'My name is {name:^8s}, and I am{age:^4d} years old. My height is {height:^6.2f} m.')

  My name is  Cheng  , and I am 29  years old. My height is  1.75  m.

  >>> width = 10

  >>> precision = 4

  >>> value = 11/3

  >>> f'result:{value:{width}.{precision}}'

  'result:     3.667'

  f-string大括号内也可填入lambda表达式,但lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符,为避免歧义,需要将lambda表达式置于圆括号 () 内:

  >>>print(f'My name is {name:^8s}, and I am{age:^4d} years old. My height is {height:^6.2f} m.My weight is {(lambda x:x*2)(age+height):^6.2f} kg .')

  My name is  Cheng  , and I am 29  years old. My height is  1.75  m.My weight is 61.50  kg.

 

posted on 2020-05-28 09:51  六尺巷人  阅读(640)  评论(0编辑  收藏  举报

导航