返回介绍

建议28:格式化字符串时尽量使用 .format 方式而不是 %

发布于 2024-01-30 22:19:09 字数 4694 浏览 0 评论 0 收藏 0

Python中内置的%操作符和.format方式都可用于格式化字符串。先来看看这两种具体格式化方法的基本语法形式和常见用法。

%操作符根据转换说明符所规定的格式返回一串格式化后的字符串,转换说明符的基本形式为:% [ 转换标记][ 宽度 [. 精确度 ]]转换类型。其中常见的转换标记和转换类型分别如表3-2和表3-3所示。如果未指定宽度,则默认输出为字符串本身的宽度。

表3-2 格式化字符串转换标记

表3-3 格式化字符串转换类型

%操作符格式化字符串时有如下几种常见用法:

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 radius 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][宽度][,][.精确度][转换类型]。其中填充符可以是除了“{”和“}”符号之外的任意符号,对齐方式和符号分别如表3-4和表3-5所示。转换类型跟%操作符的转换类型类似,可以参见表3-3。

表3-4 .format方式格式化字符串的对齐方式

表3-5 .format方式格式化字符串符号列表

.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,)这种形式才能避免错误,注意逗号。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文