- 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章 性能剖析与优化
建议4:在代码中适当添加注释
Python中有3种形式的代码注释:块注释、行注释以及文档注释(docstring)。这3种形式的惯用法大概有如下几种:
1)使用块或者行注释的时候仅仅注释那些复杂的操作、算法,还有可能别人难以理解的技巧或者不够一目了然的代码。
2)注释和代码隔开一定的距离,同时在块注释之后最好多留几行空白再写代码。下面两行代码显然第一行的阅读性要好。
x=x+1 # increace x by 1 ① x=x+1 #increase x by 1 ②
3)给外部可访问的函数和方法(无论是否简单)添加文档注释。注释要清楚地描述方法的功能,并对参数、返回值以及可能发生的异常进行说明,使得外部调用它的人员仅仅看docstring就能正确使用。较为复杂的内部方法也需要进行注释。推荐的函数注释如下:
def FuncName(parameter1 , parameter2): """Describe what this function does. #such as "Find whether the special string is in the queue or not" Args: parameter1: parameter type, what is this parameter used for. #such as strqueue:string,string queue list for search parameter2: parameter type, what is this parameter used for. #such as str:string,string to find Returns: return type, return value. #such as boolean,sepcial string found return True,else return False """ function body ... ...
4)推荐在文件头中包含copyright申明、模块描述等,如有必要,可以考虑加入作者信息以及变更记录。
""" Licensed Materials - Property of CorpA (C) Copyright A Corp. 1999, 2011 All Rights Reserved CopyRight statement and purpose... -------------------------------------------------------------------------- File Name : comments.py Description : description what the main function of this file Author: Author name Change Activity: list the change activity and time and author information. -------------------------------------------------------------------------- """
有人说,写代码就像写诗,你见过谁在自己写的诗里加注释吗?这种说法受到许多人的追捧,包括一些Python程序员。但我的看法是,代码跟诗不太一样,需要适当添加注释。注释直接关系到代码的可读性和可维护性,同时它还能够帮助发现错误的藏身之处。因为代码是说明你怎么做的,而好的注释能够说清楚你想做什么,它们相辅相成。但往往有些程序员并不重视它,原因是多方面的,有人觉得程序的实现才是最重要的,至于注释是一件浪费时间的事情;还有的人明明知道注释很重要,可是太懒,不愿意写或者随便应付;也有人重视注释但却不得要领,反而使其成为代码的一种累赘。下面针对以上几个心态举几个实际中常见例子。
示例一:代码即注释(不写注释)。没有注释的代码通常会给他人的阅读和理解带来一定困难,即使是自己写的代码,过一段时间再回头阅读可能也需要一定时间才能理解当初的思路。
a=3 n=5 count,sn,tn=1,0,0 while count<=n: . tn+=a sn+=tn a*=10 count+=1 print sn
示例二:注释与代码重复。注释应该是用来解释代码的功能、原因以及想法的,而不是对代码本身的解释。
# coding=utf-8 print "please input number n" n=input() print "please input number m" m=input() t=n/2 # t 是n 的一半 # 循环,条件为t*m/n 小于n while(t*m/(n+1) < n): t=0.5*m+n/2 # 重新计算t 值 print t
示例三:利用注释语法快速删除代码。对于不再需要的代码,应该将其删除,而不是将其注释掉。即使你担心以后还会用到,版本控制工具也可以让你轻松找回被删除的代码。
x=2 y=5 z=3 """following code is no longer needed since there is a better way if x>y:t=x;x=y;y=t if x>z:t=z;z=x;x=t if y>z:t=y;y=z;z=t print "the order from small to big is: %d %d %d" % (x,y,z) """ order_list=[x,y,z] order_list.sort() print order_list
其他比较常见的问题还包括:代码不断更新而注释却没有更新;注释比代码本身还复杂烦琐;将别处的注释和代码一起拷贝过来,但上下文的变更导致注释与代码不同步;更有个别人将注释当做自己的娱乐空间从而留下个性特征等,这几种行为都是平时要注意避免的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论