zoukankan      html  css  js  c++  java
  • 【Python】更优的字符串格式化方式 -- "format"替代"%s"

    背景

    前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因。各博客网站介绍相关用法的博客很多,但是都没有对为什么使用做出说明。我也是直到看了《编写高质量代码 改善Python的91个建议》这本书,才对这一块有了一定的认识。

    Why format?

    我们知道,想写出Pythonic的程序需要对标准库有充分的理解,特别是内置函数和内置数据类型。比如,对于字符串格式化方法,一般的写法如下:

    print("Hello,%s" % "Tom")

    其实%s是非常影响可读性的,因为数量多了以后,很难清楚哪一个占位符对应哪一个实参。所以相对应的Pythonic些代码是这样的:

    print ("Hello,%(name)s" % {"name":"Tom"})
    # 参数比较多的情况下这样用
    value = {"greet": "Hello world", "language": "Python"}   
    print("%(greet)s from %(language)s." % value)

    %占位符来自于大家的先验知识,其实对于新手而言,有点“莫名其妙”,所以更具有Pythonic风格的代码如下:

    print("{greet} from {language}.".format(greet="Hello world", language="Python")

    事实上,str.format() 是Python最为推荐的字符串格式化方法。str.format() 方法非常清晰地表明了这条语句的意图,而且模板的使用也减少了许多不必要的字符,使可读性得到了很大的提升。

    format相关用法

    下面介绍的是format格式化字符串的一些方法。

    1、使用位置参数

    要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表

    >>> li = ['Bingo',18]
    >>> 'my name is {} ,age {}'.format('Bingo',18)
    'my name is Bingo ,age 18'
    >>> 'my name is {1} ,age {0}'.format(10,'Bingo')
    'my name is Bingo ,age 10'
    >>> 'my name is {1} ,age {0} {1}'.format(10,'Bingo')
    'my name is Bingo ,age 10 Bingo'
    >>> 'my name is {} ,age {}'.format(*li)
    'my name is Bingo ,age 18'

    2、使用关键字参数

    要点:关键字参数值要对得上,可用字典当关键字参数传入值,字典前加**即可

    >>> hash = {'name':'Bingo','age':18}
    >>> 'my name is {name},age is {age}'.format(name='Bingo',age=19)
    'my name is Bingo,age is 19'
    >>> 'my name is {name},age is {age}'.format(**hash)  # 通过关键字,可用字典当关键字传入值时,在字典前加**即可
    'my name is Bingo,age is 18'

    3、填充与格式化(:[填充字符][对齐方式 <^>][宽度])

    ^、<、>分别是居中、左对齐、右对齐,':'后面紧跟一个整数可以限定该字段的最小宽度。

    :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

    >>> '{0:*>10}'.format(10)  ##右对齐
    '********10'
    >>> '{0:*<10}'.format(10)  ##左对齐
    '10********'
    >>> '{0:*^10}'.format(10)  ##居中对齐
    '****10****'

    4、精度与进制

    >>> '{0:.2f}'.format(1/3)
    '0.33'
    >>> '{0:b}'.format(10)    #二进制
    '1010'
    >>> '{0:o}'.format(10)     #八进制
    '12'
    >>> '{0:x}'.format(10)     #16进制
    'a'
    >>> '{:,}'.format(12369132698)  #千分位格式化
    '12,369,132,698'

    5、通过下标

    >>> li
    ['Bingo', 18]
    >>> 'name is {0[0]} age is {0[1]}'.format(li)
    'name is Bingo age is 18

     6、通过对象属性

    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)
        
    print(Person('BINGO', 18))  # 输出 This guy is BINGO,is 18 old

    7、其他类型

    >>> '{:,}'.format(1234567890)  # 用,号还能用来做金额的千位分隔符。
    '1,234,567,890'

     8、格式转化

    !s、!a、!r

    一个对象本身不是str,ascii,repr格式,可以使用!s、!a、!r将其转成str,ascii,repr

    FAQ

    • 如果字符串里面含有 "{"  或者  "}",怎么处理
    需要把 ”{“ 和 ”}“ 字符以 ”{{“ 和 ”}}“ 代替。

    参考资料:

    https://www.cnblogs.com/benric/p/4965224.html

    https://www.cnblogs.com/wongbingming/p/6848701.html

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/Detector/p/8516464.html
Copyright © 2011-2022 走看看