zoukankan      html  css  js  c++  java
  • Python格式化字符串知多少

    字符串格式化相当于字符串模板。也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(%) 替换。如一句问候语:“Hello 李宁”,其中“Hello”是固定的,但“李宁”可能变成任何一个人的名字,如“乔布斯”,所以在这个字符串中,“Hello”是固定的部分,而“李宁”是动态变化的部分,因此,需要用“%”操作符替换“李宁”,这样就形成了一个模板。
     
    Hello %s
     
    上面的代码中,“%”后面的s是什么呢?其实字符串格式化操作符后面需要跟着动态值的数据类型,以及更细节的格式(如对于浮点数来说,小数点后要保留几位),这里的“%s”表示动态部分要被替换成字符串类型的值。如果在字符串模板中有多个要被替换的部分,需要按顺序用“%”表示,然后在格式化字符串时,传入的值也要符合这个顺序。下面的代码演示了格式化字符串的基本用法。
    formatStr = "Hello %s. Today is %s, Are there any activities today?"
    #  初始化字符串格式化参数值,此处必须使用元组,不能使用列表
    values = ('Mike', 'Wednesday')
    #  格式化字符串
    print(formatStr % values)
    运行结果如下图所示:

      

    从上面的代码可以看出,不仅在为字符串模板指定格式化参数时要使用百分号(%),在格式化字符串时,也要像取模一样使用“%”操作符。还有就是指定字符串格式化参数值要使用元组,在这里不能使用列表。
    1. 模板字符串
     
    在string模块中提供了一个用于格式化字符串的Template类,该类的功能是用同一个值替换所有相同的格式化参数。Template类的格式化参数用美元符号($)开头,后面跟着格式化参数名称,相当于变量名。在格式化时,需要使用Template类的substitute方法,该方法用于指定格式化参数对应的值。
    from string import Template
    template = Template("$s $s $s ")
    template.substitute(s = "Hello")
    在上面的代码中,通过Template类的构造方法传入了一个格式化字符串,在这个格式化字符串中包含了3个“$s”,然后调用了substitute方法格式化这个字符串,该方法指定了s参数值为“Hello”,最后的替换结果是“Hello Hello Hello”,也就是说,在格式化字符串中,有多少个“$s”,就替换多少个“$s”。下面的代码完整地演示了如何使用Template类格式化字符串。
    # 引用string模块中的Template类
    from string import Template
    template1 = Template("$s是我最喜欢的编程语言, $s非常容易学习,而且功能强大")
    # 指定格式化参数s的值是Python
    print(template1.substitute(s='Python'))
    # 当格式化参数是一个字符串的一部分时,为了和字符串的其他部分区分开,
    # 需要用一对大括号将格式化参数变量括起来
    template2 = Template("${s}stitute")
    print(template2.substitute(s='sub'))
     
    template3 = Template("$dollar$$相当于多少$pounds")
    # 替换两个格式化参数变量
    print(template3.substitute(dollar=20,pounds='英磅'))
     
    template4 = Template("$dollar$$相当于多少$pounds")
    data = {}
    data['dollar'] = 100
    data['pounds'] = '英磅'
    # 使用字典指定格式化参数值
    print(template4.substitute(data))
    运行结果如下图所示:
     
    2. 字符串的format方法
     
    字符串本身也有一个format方法用于格式化当前的字符串。这个format方法和前面讲的格式化操作符(%)不太一样。字符串格式化参数并不是用百分号(%)表示,而是用一对大括号({}),而且支持按顺序指定格式化参数值和关键字格式化参数。例如,下面的代码通过format方法按顺序为格式化字符串指定了参数值。
     
    print("{} {} {}".format(1,2,3)) # 运行结果:1 2 3
     
    我们可以看到,上面的代码在字符串中指定了3对空的大括号,这代表3个格式化参数,不需要指定数据类型,可以向其传递Python语言支持的任何值。通过format方法传入3个值(1,2,3),这3个值会按顺序替换格式化字符串中的3对空的大括号。
    命名格式化参数是指在一对大括号中指定一个名称,然后调用format方法时也要指定这个名称。
    print("{a}  {b}  {c}".format(a = 1,c = 2,b = 3))   # 运行结果:1  3  2
    上面的代码在3对大括号中分别添加了“a”、“b”、“c”。通过format方法指定了这3个关键字参数的值。我们可以看到,并没有按顺序指定关键字参数的值。这也是使用关键字参数的好处,只要名字正确,fomat参数的顺序可以任意指定。当然,顺序方式和关键字参数方式可以混合使用,而且还可以指定顺序方式中格式化参数从format方法提取参数值的顺序,甚至可以取format方法参数值的一部分。
     
    3. 更进一步控制字符串格式化参数
    format方法的功能远不止这些,在一对大括号中添加一些字符串格式化类型符,可以对格式化字符串进行更多的控制。例如,下面的代码会将一个字符串类型的格式化参数值按原样输出、通过repr函数输出,以及输出其Unicode编码。
    print("{first!s} {first!r} {first!a}".format(first = ""))
    执行这行代码,会输出如下的结果。
     
    中 '中' 'u4e2d'
     
    除此之外,format方法还支持很多其他的控制符,例如,可以将整数按浮点数输出,也可以将十进制数按二进制、八进制、十六进制格式输出。下面的代码为我们演示了如何使用这些控制符格式化字符串。
    # 运行结果:原样输出:中  调用repr函数:'中'  输出Unicode编码:'u4e2d'
    print("原样输出:{first!s}  调用repr函数:{first!r}  输出Unicode编码:{first!a}".format(first = ""))
    #  将21按浮点数输出,运行结果:整数:21  浮点数:21.000000
    print("整数:{num}  浮点数:{num:f}".format(num = 21))
    #  将56按十进制、二进制、八进制和十六进制格式输出
    #  运行结果:十进制:56  二进制:111000  八进制:70  十六进制:38
    print("十进制:{num}  二进制:{num:b}  八进制:{num:o}  十六进制:{num:x}".format(num = 56))
    #  将533按科学计数法格式输出,运行结果:科学计数法:5.330000e+02
    print("科学计数法:{num:e}".format(num = 533))
    #  将0.56按百分比格式输出,运行结果:百分比:56.000000%
    print("百分比:{num:%}".format(num = 0.56))
    运行结果如下图所示。
     
    4. 字段宽度、精度和千位分隔符
     
    在前面讲到使用format方法可以让待格式化的值左侧或右侧补空格,不过这种填空格的效果看上去并不美观,而且一般的用户也分不清前面或后面到底有多少个空格。所以最合适的方式就是在值的前面或后面补0。例如,如果写一本书,章节超过了10章,为了让每一章的序号长度都一样,可以使用01、02、03、…、11、12这样的格式。对于10以后的章节,按原样输出即可。不过对于10以下的章节,就需要在数字前面补一个0了。要实现这个功能,就需要使用{chapter:02.0f}来格式化章节序号。其中chapter是格式化参数,第一个0表示如果位数不足;前面要补0,2表示整数部分是2位数字;第2个0表示小数部分被忽略;f表示以浮点数形式格式化chapter指定的值。
    #  运行结果:第04章
    print("第{chapter:02.0f}章".format(chapter = 4));
     
    如果想用format方法控制值的左、中、右对齐,可以分别使用“<”,“^”和“>”。
    # 让1、2、3分别以左对齐、中对齐和右对齐方式显示
    print('{:<10.2f}
    {:^10.2f}
    {:>10.2f}'.format(1,2,3))
     
    不管是哪种方式对齐(左、中、右),在很多情况下,值的总长度要比指定宽度小,在默认情况下,不足的位要补空格,但我们也可以通过在“<”、“^”和“>”前面加符号,让这些不足的位用这些符号替代空格补齐。
    # “井号”在宽度为20的区域内中心对齐,并左右两侧添加若干个井号(#),两侧各添加8个井号
    #  运行结果:######## 井号 ########
    print("{:#^20}".format(" 井号 "))
     
    对于需要在前面显示负号的数值,如-3、-5。可以通过在等号(=)前面加上字符,以便在负号和数值之间加上特殊符号。
    # 在5.43和负号(-)之间显示“^”,运行结果:-^^^^^5.43
    print("{0:^=10.2f}".format(-5.43))
     
    最后让我们来讨论一下进制转换。如果将10进制分别转换为二进制、八进制和十六进制的数,需要分别使用“b”、“o”和“x”类型符。如下面的代码将43转换为二进制的数。
    #  运行结果:101011
    print("{:b}".format(43))
     
    5. f字符串
     
    在新版的Python中,提供了一种f字符串。也就是在字符串之前加一个f,这样在字符串中就可以直接使用外部变量了,只不过变量要使用一对大括号括起来。代码如下:
    name = 'Bill'
    age = 30
     
    print(f'姓名:{name}, 年龄:{age}')
     
    要获得Python格式化字符串的完整源代码,可以关注”极客起源“公众号,并输入777412来获得相关资源。
     
     

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/nokiaguy/p/12100846.html
Copyright © 2011-2022 走看看