设为首页 收藏本站
查看: 605|回复: 0

[经验分享] Python常见编程规范总结

[复制链接]

尚未签到

发表于 2015-11-29 12:02:56 | 显示全部楼层 |阅读模式
Pythonic定义
  Python最常用的编码风格还是PEP8,详见:http://jython.cn/dev/peps/pep-0008/
  Pythonic确实很难定义,先简单引用下《Python之禅》中的几句经典阐释:



优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
  举个简单的例子,使用Pythonic风格编码的快速排序算法代码如下所示:



def quicksort(array):
less = [];
greater = [];
if len(array) <= 1:
return array
pivot = array.pop()
for x in array:
if x <= pivot:
less.append(x)
else:
greater.append(x)
return quicksort(less) + [pivot] + quicksort(greater)
Pythonic代码风格


  • 交换两个变量
  C语言代码如下:



1 int a = 1, b = 2;
2 int tmp = a;
3 a = b;
4 b = tmp;
5
6 //如果两个变量都为整数类型,当然也可使用:
7
8 int a = 1, b = 2;
9 a = a^b;
10 b = a^b;
11 a = a^b;
12
13 //这样的形式,可以不用引入第三个变量
  Pythonic代码如下:



1 a, b = b, a

  • Python可以灵活的使用迭代器,安全的关闭文件描述符,如下:



1 for i in alist:
2     do_sth_with(i)
3
4 with open(path, 'r') as f:
5     do_sth_with(f)
  Pythonic追求的是对Python语法的充分发挥,写出的代码带Python味儿,而不是看着向C或JAVA代码;


  • 不应过分使用技巧



1 a = [1, 2, 3, 4]
2 b = 'abcdef'
3 print a[::-1]
4 print b[::-1]
  使用Python比较多的人可以比较容易看出其作用,就是输出逆序的a和b,但还是比较晦涩,Pythonic追求的是充分利用Python语法,上面代码可写为:



1 a = [1, 2, 3, 4]
2 b = 'abcdef'
3 print list(reversed(a))
4 print list(reversed(b))

  • 字符串格式化
  我们很多人一般这样写,比较简洁:



1 name = 'Tom'
2 age = '20'
3 print 'Hello %s, your age is %s !' % (name, age)
  其实,%s是比较影响可读性的,尤其是数量多了之后,很难清楚哪个占位符对应哪个实参,比较Pythonic的代码如下:



1 value = {'name': 'Tom', 'age': '20'}
2 print 'Hello %(name)s, your age is %(age)s !' % value
  使用%占位符的形式,依旧不是Python最推荐的,最具Pythonic风格的代码如下:



1 print 'Hello {name}, your age is {age} !'.format(name = 'Tom', age = '20')
  str.format()是Python最为推荐的字符串格式化方法;


  • 包和模块
  包和模块的命名采用小写、单数形式,而且短小;
  包通常仅作为命名空间,可以只包含空的__init__.py文件;


  • 过多的if...elif...elif......else...应使用字典来实现



1 if n == 0:
2     print "You typed zero..."
3 elif n == 1:
4     print "You are in top..."
5 elif n == 2:
6     print "n is even number..."
7 else:
8     print "Default value"
9
10 # 使用字典来实现更好一些
11
12 def f(x):
13     return {
14         0: "You typed zero...",
15         1: "You are in top...",
16         2: "n is even number...",
17     }.get(x, "Default value")
编写Pythonic代码

避免劣化代码


  • 避免只用大小写来区分不同的对象;
  • 避免使用容易引起混淆的名称,变量名应与所解决的问题域一致;
  • 不要害怕过长的变量名;

代码中添加适当注释


  • 行注释仅注释复杂的操作、算法,难理解的技巧,或不够一目了然的代码;
  • 注释和代码要隔开一定的距离,无论是行注释还是块注释;
  • 给外部可访问的函数和方法(无论是否简单)添加文档注释,注释要清楚地描述方法的功能,并对参数,返回值,以及可能发生的异常进行说明,使得外部调用的人仅看docstring就能正确使用;
  • 推荐在文件头中包含copyright申明,模块描述等;
  • 注释应该是用来解释代码的功能,原因,及想法的,不该对代码本身进行解释;
  • 对不再需要的代码应该将其删除,而不是将其注释掉;

适当添加空行使代码布局更为优雅、合理


  • 在一组代码表达完一个完整的思路之后,应该用空白行进行间隔,推荐在函数定义或者类定义之间空两行,在类定义与第一个方法之间,或需要进行语义分隔的地方空一行,空行是在不隔断代码之间的内在联系的基础上插入的;
  • 尽量保证上下文语义的易理解性,一般是调用者在上,被调用者在下;
  • 避免过长的代码行,每行最好不要超过80字符;
  • 不要为了保持水平对齐而使用多余的空格;

编写函数的几个原则


  • 函数设计要尽量短小,嵌套层次不宜过深;
  • 函数申明应做到合理、简单、易于使用,函数名应能正确反映函数大体功能,参数设计应简洁明了,参数个数不宜过多;
  • 函数参数设计应考虑向下兼容;
  • 一个函数只做一件事,尽量保证函数语句粒度的一致性;

将常量集中到一个文件
  Python没有提供定义常量的直接方式,一般有两种方法来使用常量;


  • 通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词,如MAX_NUMBER,TOTLE等;
  • 通过自定义的类实现常量功能,常量要求符合两点,一是命名必须全部为大写字母,二是值一旦绑定便不可再修改;



1 class _const:
2
3     class ConstError(TypeError): pass
4     class ConstCaseError(ConstError): pass
5
6     def __setattr__(self, name, value):
7         if name in self.__dict__:
8             rasie self.ConstError, "Can't change const.%s" % name
9         if not name.isupper():
10             raise self.ConstCaseError, "const name '%s' is not all uppercase" % name
11
12         self.__dict__[name] = value
13
14 import sys
15 sys.modules[__name__] = _const()
  无论是用哪种方式,都应该将常量集中到一个文件中,便于维护管理;
  
  ——《编写高质量代码》读后总结

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144896-1-1.html 上篇帖子: python bottle 框架开发任务管理系统 V_1.0版 下篇帖子: 纯Python综合图像处理小工具(1)分通道直方图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表