- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
建议28:格式化字符串时尽量使用 .format 方式而不是 %
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论