格式化字符串时尽量使用.format方式而不是%
Python 中内置的%操作符和.format方式都可以用于格式化字符串。先来看看这两种具体格式化方法的基本语法形式和常见用法。
% 操作符根据转换说明符所规定的格式返回一串格式化后的字符串,转换说明符的基本形式为:%[转换标记][宽度[.精确度]]转换类型。其中常见的转换标记和转换类型分别如表所示:
表1-1 格式化字符串转换标记 表1-2格式化字符串转换类型%操作符格式化字符串时有如下几种常见用法:
1)直接格式化字符或者数值。
>>> print “your score is %06.1f” % 9.5
Your score is 0009.5
2)以元组的形式格式化。
>>> import math
>>> itemname = 'circumference'
>>> radius = 3
>>> print "the %s of a circle with radius %f is %0.3f " %(itemname,radius,math.p
i*radius*2)
the circumference of a circle with 3.000000 is 18.850
3)以字典的形式格式化。
>>> itemdict = {'itemname':'circumference','radius':3,'value':math.pi*radius*2}
>>> print "the %(itemname)s of a circle with radius %(radius)f is %(value)0.3f
" % itemdict
the circumference of a circle with radius 3.000000 is 18.850
>>>
.format 方式格式化字符串的基本语法为:[[填充符]对齐方式][符号][#][0][宽度][,][.精确度][转换类型]。其中填充符可以是除了“{” 和“}” 符号之外的任意符号,对齐方式和符号分别如表1-3和表1-4所示。转换类型跟%操作符的转换类型类似,可以参见表1-2
表1-3 .format方式格式化字符串的对齐方式 表1-4 .format方式格式化字符串符号列表1)使用位置符号。
>>> "The number {0:,} in hex is: {0:#x},the number {1} in oct is {1:#o}".format(
4746,45)
'The number 4,746 in hex is: 0x128a,the number 45 in oct is 0o55'
>>>
#
其中{0}
表示format
方法中对应的第一个参数,{1}
表示format
方法对应的第二个参数,依次递推
2)使用名称。
>>> print "the max number is {max},the min number is {min},the average number is
{average:0.3f}".format(max=189,min=12.6,average=23.5)
the max number is 189,the min number is 12.6,the average number is 23.500
3)通过属性。
>>> class Customer(object):
... def __init__(self,name,gender,phone):
... self.name = name
... self.gender = gender
... self.phone = phone
... def __str__(self):
... return 'Customer({self.name},{self.gender},{self.phone})'.format(self=self)
# 通过str()函数返回格式化的结果
>>> str(Customer("Lisa","Female","67889"))
'Customer(Lisa,Female,67889)'
>>>
4)格式化元组的具体项。
>>> point = (1,3)
>>> 'X:{0[0]};Y:{0[1]}'.format(point)
'X:1;Y:3'
>>>
在了解了两种字符串格式的基本用法之后我们再回到本节开头提出的问题:为什么要尽量使用format方式而不是%操作符来格式化字符串。
理由一:format方式在使用上较%操作符更为灵活。使用format方式时,参数的顺序与格式化的顺序不必完全相同。如:
>>> "The number {1} in hex is: {1:#x},the number {0} in oct is {0:#o}".format(474
6,45)
'The number 45 in hex is: 0x2d,the number 4746 in oct is 0o11212'
上例中格式化的顺序为{1},{0},其对应的参数申明的顺序却相反,{1}与45对应,而用%方法需要使用字典形式才能达到同样的目的。
理由二:format方式可以方便地作为参数传递。
>>> weather=[("Monday","rain"),("Tuesday","sunny"),("Wednesday","sunny"),("Thurs
day","rain"),("Friday","cloudy")]
>>> formatter = "Weather of '{0[0]}' is '{0[1]}'".format
>>> for item in map(formatter,weather):#format
方法作为第一个参数传递给map函数
... print item
...
Weather of 'Monday' is 'rain'
Weather of 'Tuesday' is 'sunny'
Weather of 'Wednesday' is 'sunny'
Weather of 'Thursday' is 'rain'
Weather of 'Friday' is 'cloudy'
>>>
理由三:%最终会被.format方式所代替。这个理由可以认为是最直接的原因,根据Python的官方文档(http://docs.python.org/2/library/stdtypes.html#string-formatting),.format()方法最终会取代%,在Python3.0中.format方法是推荐使用的方法,而之所以仍然保留%操作符是为了保持向后兼容。
理由四:%方法在某些特殊情况下使用时需要特别小心。
>> itemname =("mouse","mobilephone","cup")
>>> print "itemlist are %s" %(itemname) #
使用%方法格式化元组
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>>
>>> print "itemlist are %s" %(itemname,) #
注意后面的符号,
itemlist are ('mouse', 'mobilephone', 'cup')
>>> print "itemlist are {}".format(itemname) #
使用format
方法直接格式化不会抛出异常
itemlist are ('mouse', 'mobilephone', 'cup')
>>>
上述例子中本意是把itemname看做一个整体来进行格式化,但直接使用时却抛出TypeError,对于%直接格式化字符的这种形式,如果字符本身为元组,则需要使用在%使用(itemname,)这种形式才能避免错误,注意逗号。
网友评论