设为首页 收藏本站
查看: 1647|回复: 0

[经验分享] Python 字符串格式化

[复制链接]

尚未签到

发表于 2018-8-14 11:12:17 | 显示全部楼层 |阅读模式
  Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。
  下面是使用'%'的例子:
"""PI is %f..." % 3.14159 # => 'PI is 3.141590...'"%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11'"The usage of %(language)s" % {"language": "python"} # => 'The usage of python'  格式很像C语言的printf是不是?由于'%'是一个操作符,只能在左右两边各放一个参数,因此右边多个值需要用元组或者字典来包括,不能元组字典一起用,缺乏灵活度。
  同样的例子用format方法改写:
"PI is {0}...".format(3.14159) # => 'PI is 3.14159...'"{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11'"The usage of {language}".format(language = "Python") # => 'The usage of Python'  是不是很直观?(当然,使用C语言的我也很喜欢前一种格式表达方式 :-) )
格式化字符串
"{named} consist of intermingled character {0} and {1}".format("data", "markup", \  
    named = "Formats trings")format(10.0, "7.3g") # => '     10'"My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'
  注意第一行的'\',如果一个语句要换行,必须在结尾加上反斜线转义。
  用'%'无法像这样将元组和字典混用。其实这里是命名参数,Python的一个特性。可以在定义数组的时候用*args, **kwargs语法展开集合和字典。需要注意,命名参数放在后面。
  第二个语句表示format内置函数用来格式化单个值。
  第三个语句表示了{}的转义,因为{}在被格式化字符串里是特殊字符,不能直接显示。转义方式是多嵌套一层。
使用属性和索引
"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'  '{0.name}' 相当于调用对象的属性 open('out.txt', 'w').name
"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'  使用索引也是可以的。
  obj[key] 相当于 obj.____getitem____('key')
标准说明符(Specifiers)
  写过C语言的程序员应该清楚printf的复杂。format也定义了很多标准的说明符,用来解释一个值的格式,然后插入字符串内。例如:
"My name is {0:8}".format('Fred') # => 'My name is Fred    '  ':'之后便是说明符了,上面例子中说明符只有一个'8'(minimumwidth),它表示插入的值宽度至少为8。'Fred'只有4,所以又加了4个空格。
  说明符的详细格式为:
  [[fill]align][sign][#][0][minimumwidth][.precision][type]
  (不比C的printf更简洁啊!)
  注意:'[]'表示该元素可选。所以,所有的格式说明符都是可选的!就像之前的例子,几乎都没有用这个(只是为了例子更清晰)。实际上,这些是很有用的。
  我们一个个来看:

  •   [fill]align 表示排列方式。当minimumwidth设置的比插入的值大时,就有了留白,就像上一个例子中的'My name is Fred '。默认把留白放在了右边,也就是说插入值默认是左对齐的。如果我们试试{0:>8},会发现结果变成了'My name is Fred'。
      fill 表示用来填充留白的字符。只有在align指定了的情况下fill才有用! align可以是下面的标识:

    •   < 左对齐,默认
    •   > 右对齐
    •   = 将留白放在align标识后面,只对数字有效。什么意思呢?align下面会讲到,显示数字的正负号,同样只对数字有效。如果指定了'=',那么就会把数字的正负号显示在留白的前面。例如:format(-12, "0=8") # => '-0000012'注意这里用的是格式化单个值的内置函数format。'0'是fill元素,用它来填充留白;'='就是该标识了;'8'是指最小宽度为8,因此才有5个留白。那么align呢?align其实就是说明正负号的显示方式,这里使用默认的'-',之后会讲到。
    •   ^ 居中对齐

  •   sign 数字符号,只对数字有效。

    •   + 显示加号和减号
    •   - 不显示加号,显示减号。在不指定最小宽度的情况下负数总是比正数多占一个符号位置。默认
    •   ' ' (一个空格) 用一个留白代替加号

  •   # 显示数字的前缀表示几进制(0b, 0o, 0x)
  •   0 用'0'填充留白。
  •   minimumwidth 指定最小宽度,已经用过很多次了。
  •   .precision 'precision'是一个十进制数字,表示显示小数点后几位。
  •   type 值的类型:

    •   e 科学计数法表示,小写e
    •   E 科学计数法表示,大写E
    •   f 显示为定点数,默认小数点后六位
    •   F 同f
    •   g 自动选择是否用科学记数法表示
    •   G 同g
    •   n 同g,使用本地表示方式
    •   % 使用百分比表示
    •   ''(空) 同g
    •   b 二进制
    •   c 字符型,把数字转成表示unicode的字符
    •   d 十进制
    •   o 八进制
    •   x 十六进制,显示小写字母
    •   X 十六进制,显示大写字母
    •   n 与d行为相同,使用本地的数字表示方式
    •   ''(空,没有空格) 与d相同
    •   整型:
    •   浮点数

  每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:
"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())预先转换
  ':'之后是格式说明符,之前还可以加预先转换的标识

  •   !r 调用对象的_repr_方法来转换成标准字符串
  •   !s 调用对象的_str_方法来转换成字符串
重写_format_方法
  我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是format内置方法。format则是简单地调用该值的_format_方法。
def format(value, format_spec):  
    return value.__format__(format_spec)
  在object类内实现了_format方法,只是将本身用str()转换成字符串,然后将字符串传入内置的format方法,实际上就是调用转换为字符串后的format_方法。
class object:  
    def __format__(self, format_spec):
  
        return format(str(self), format_spec)
  int/float/str自身实现了_format_方法,前面已经介绍了它们各自的说明符。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551568-1-1.html 上篇帖子: python第二周作业 购物车 下篇帖子: python 模块包裹
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表