如何规范自己的编程以及软件开发目录(一)
python 为什么要做这些?
可想而知,随着你的编码慢慢的变多,内容也会变得越来越多;所以,不用想的,规范化自己的编程以及软件开发目录这十分的重要;那么如何做这些东西了?我们作为初学者,目的就是为了遵循代码规范,这是最基本的,而且以后工作了,每个团队的规范还不一样,尽可能的与自己的团队保持一致,目前初学者按照官方要求即可。只要在以后多观察代码风格,多看几次就可以学会了。
python中如何规范自己的编程?
关于注释
注释不止为了自己看清楚自己的代码,而且还是为以后的开发人员做准备的,其实一段时间后,当程序作出一定的修改后或者以后改正某个bug的时候,可能未来的我们都会忘记相关的细节,所以此时的注释相当的重要。
每条注释是以(#)开始,一直到该行末尾结束,我们可以在注释中放任何东西,因为python会无视它的存在。为了更好的注释,我们给出以后的几个规范:
(1)假设编程读者的水平与你一样(不要去解释什么是字符串,什么是int类型等)
(2)不要去注释那些毫无意义的东西
count = count +1 # add one to count
(3)很多程序员会在代码上写上写上一些以“TODO”或者“FIXME”开始的注释,目的是为了处理或清除一些未完成的任务
(4)如果你在编写某段程序的时候绞尽脑汁的思考,应该编写注释,以后别人在思考你这段代码的时候就不比较绞尽脑汁的思考这个地方。尤其重要的地方是,如果你在开发程序或者编写某个函数时需要使用要点来描述,尽可能的描述详细一点。在开 发工作结束的时候,你可以直接将要点全部保留下来做注释。
(5)同样,如果某个bug很难查明,或者其修改方法比较复杂,那么你就需要对其进行注释对其进行解释。如果不这么做,那么其他负责这部分的程序员就可能认为没有必要这么麻烦,修改回原来的模样,从而使你的心血付诸东流。
(6)如果我们需要大量的注解去解释某部分代码,那么,就需要我们自己去整理这部分代码。 比如说,如果我们需要对一个函数的15个列表进行注解,那么我们就应该将函数拆分成更小的代码块,每个注释只处理几个列表。
(7)过时的注释还不如不注释。因此修改某段代码后,一定要检查相关的注释,并及时的更新自己的注释,以便于准确适当的描述代码的功能。
(8)注释不是越多越好,弄得全篇都是注释,却很少看见代码,这样就曲解了注释意思了
所以说,一定要养成良好的注释代码的习惯,边写代码边注释,及时的记录下来你的思路,举个例子,代码是鱼,注释就是水,有了正确的注释,鱼才能更好的生存。还有就是多提高自己对代码的解释能力,用精炼的语言表达出代码的核心价值所在,那么你写的代码就是成功的。
下面举个简单的例子:
def find_two_smallest(L): '''Return a tuple of the indices of the two smallest values in list L''' smallest = min(L) min1 = L.index(smallest) L.remove(smallest) next_smallest = min(L) min2 = L.index(next_smallest) L.insert(min1,smallest) #为了获取第二个最小值在原始列表中的索引,我们还需要根据实际情况给min2加1 if min1<=min2: min2+=1 return(min1,min2)
python中的特殊注解
比如,python中有一行声明python编码格式的单行注解,这里指定的文件的编码为utf-8。这行特殊注解只能放在文件的第一行或者开头。
#_*_coding:utf-8_*_
还有一种是说明脚本语言是python的,是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。
#!/usr/bin/python
规范命名变量
名字不能乱起,如果大家都是各自的想法,那么谁也看不懂谁的东西。因此,这里说一下变量命名的规范以及注意事项。
1.变量定义规则
- 变量只能是字母,数字,下划线的任意组合
- 变量名的第一个字符不能是数字
- 关键字不能生成变量名
2.变量规范用名注意事项
- 变量名不能太长
- 变量名词不达意思
- 变量名不能为中文、拼音
3.总体命名规则
- 尽量不要使用小写字母‘l’,大写字母‘o’等容易混淆的字母
- 模块命名尽量的短小,全部使用小写的方式,可以使用下划线
- 包命名尽量短小,全部使用小写方式,不要使用下划线
- 类的命名使用CapWords的方式,模块内部使用的类用_CapWords的方式。
- 异常命名使用CapWords+Error后缀的方式。
- 全局变量尽管只在模块有效,类似C语言的static。实现的方法有两种,一种是__all__机制,另外一种是前缀一个下划线_name
- 函数命名使用全部小写的方式,可以使用下划线
- 常量命名使用全部大写方式,可以使用下划线
- 类的属性(方法和变量)命名使用全部小写方式,可以使用下划线
- 类的属性有三种作用域public,non-public和subclass API,可以理解为C++里面的public,private,protected,none-public属性前,前缀一条下划线
- 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式
- 为了避免与子类的属性命名冲突,在类的一些属性前,加入两条下划线。比如类Foo中声明__a,只能通过foo.foo__a,避免歧义,如果子类也叫foo,那就无能为力了
- 类方法的第一个参数必须是self,静态方法的而第一个参数必须是cls
关于排版的问题
一、代码排版
- 缩进,四个空格的缩进(编译器都能完成这份工作),不使用tab以及空格键,混合使用也不建议
- 每行最大长度79,换行最好使用反斜杠,最好使用圆括号。换行点要在操作符的后面敲回车
- 类和top-level函数定义之间空两行;类中方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要在空行。
二、文档排版
- 模块内容的排序:模块说明和docstring---》import-----》globals和constants---》其他定义。其中import又按标准,三方以及自己编写的顺序进行排放,之间空一行。
- 不要在一句中引用多个库,比如import os,sys等
- 如果采用import XX from XX引用库,可以省略‘module.’但是可能出现命名冲突,这时候就需要使用import XX
三、空格的使用
总体原则,避免不必要的空格
- 各种有括号前不必加空格
- 逗号、冒号、分号前不必加空格
- 函数的左括号前不必加空格,如fun(1)
- 序列的括号内不必加空格,如list[1]
- 操作符左右各加一个空格,不要为了对其增加空格。
- 函数默认参数使用的赋值符左右省略空格
- 不要将多句语句写在同一行,尽量不要使用‘;’
- if/while/for语句中,及时只有一行,也要换行
最后的几点建议
- 编程中考虑到其他python实现效率的问题,比如运算符‘+’在CPython(Python)中的运算效率很低,但在Jython中的运行效率很低,所有,应该使用.join()的方式。
- 尽量不要使用is或者is not 去替代‘==’
- 使用基于类的异常,每个模块或者包都有自己的异常类,该异常类继承于Exception
- 异常中不要裸露except,而是except后面要跟具体的exceptions。
- 异常中try的代码尽可能的少。比如
try: value = collection[key] except KeyError: return key_not_found(key) else: return handle_value(value) 要优于 try: # Too broad! return handle_value(collection[key]) except KeyError: # Will also catch KeyError raised by handle_value() return key_not_found(key)
- 使用endwith与startwith代替切片对于列表进行检查,比如说,
Yes: if foo.startswith('bar'): 优于 No: if foo[:3] == 'bar’
-
使用isinstance()比较对象类型:
Yes: if isinstance(obj, int): 优于 No: if type(obj) is type(1)
- 判断序列空或者不空,有如下规则:
Yes: if not seq: if seq: 优于 No: if len(seq) if not len(seq)
- 字符串不要以空格结尾
- 二进制判断使用if boolvalue的方式