字符串

基于字典的字符串格式化

"%(n)d %(x)s" % {"n":1, "x":"spam"}
'1 spam'

字符串格式化调用方法

>>> template = '{0}, {1}, and {2}'
>>> template.format('spam', 'ham', 'eggs')
'spam, ham, and eggs'
>>> template = '{motto}, {0} and {food}'
>>> template.format('ham', motto='spam', food='eggs')
'spam, ham and eggs'

format创建并返回一个新的对象,它可以立即打印或保存起来方便以后使用。

>>> x = '{motto}, {0} and {food}'.format(42, motto = 3.14, food = [1,2])
>>> x
'3.14, 42 and [1, 2]'
>>> x.split('and')
['3.14, 42 ', ' [1, 2]']
>>> y = x.replace('and', 'but under no circumstances')
>>> y
'3.14, 42 but under no circumstances [1, 2]'

     为什么用新的格式化方法

格式化方法的特点:

  • 拥有%表达式所没有的一些额外功能。
  • 可以更明确地进行替代值引用。
  • 考虑到操作符会有一个更容易记忆的方法名。
  • 不支持用于单个和多个替代值大小写的不同语法。
额外功能

方法调用支持直接的键和属引用:

>>> '{0:b}'.format((2 ** 16) -1)
'1111111111111111'

正如我们已经见到的,格式化表达式通常可以以其他方法实现同样的效果:

>>> bin(2 ** 16 -1)
'0b1111111111111111'
>>> '%s' % bin(2 ** 16 -1)[2:]
'1111111111111111'
显示值引用

格式化方法存在一个颇具争议的使用情况——很多值都要替换到格式化字符串中。在下面的这个例子中,方法的{i}位置标签似乎比表达式的%s更易读:

’\n%s<class %s, address %s:\n%s%s%s>\n' % (...)
'n{0}<class {1}, address {2}:\n{3}{4}{5}>\n'.format(...)

另一方面,在%表达式中使用字典键可能会答答减少这一差异的程度。此外,在Python3.1中,数字替换值变成为可选的,因此,会推翻这一传说中的好处。

在浮点数格式化上比较这一效果,格式化表达式更为精确,并且似乎要整齐一些:

>>> '{0:f},{1:.2f}, {2:05.2f}'.format(3.14159, 3.14159, 3.14159)
'3.141590,3.14, 03.14'
>>> '{:f},{:.2f}, {:06.2f}'.format(3.14159, 3.14159, 3.14159)
'3.141590,3.14, 003.14'
>>> '%f,%.2f, %06.2f' % (3.14159, 3.14159, 3.14159)
'3.141590,3.14, 003.14'
方法名和通用参数

有了Python3.1的这一自动技术修改,格式化方法唯一明确比哦六的潜在有点就是它用一个更加便于记忆的格式化方法名替代了%操作符,并且不区分耽搁和多个替代值。前者可能会使得一个方法对初学者来说乍看上去很容易(“format” 可能比多个“%”字符更容易理解),尽管这在调用的时候太主观化。

后一个不同可能更显著——使用格式化表达式,当遏制可以肚子给定,但多个值必须放在一个元组中:

>>> '%.2f' % 1.2345
'1.23'
>>> '%.2f %s' % (1.2345, 99)
'1.23 99'

格式化表达式,接受一个单个替换值,或者一项或多项的元祖。实际上,由于单个项可以独自给定,也可以在元组中给定,要格式化的元组必须作为嵌套的元组提供:

>>> '%s' % ((1.23,),)
'(1.23,)

另一方面,格式化方法通过在两种情况下接受通用的函数参数,把这两种情况绑定在一起:

>>> '{0:.2f}'.format(1.2345)
'1.23'
>>> '{0:.2f} {1}'.format(1.2345, 99)
'1.23 99'
>>> '{0}'.format(1.23)
'1.23'
>>> '{0}'.format((1.23,))
'(1.23,)'