(1)要避免劣化代码
1)避免只用大小写来区分不同的对象。如a是一个数值类型变量,A是String类型,虽在编码过程容易区分二者的含义,但这样做毫无益处,它不会给其他阅读代码的人带来多少便利。
2)避免使用容易引起混淆的名称。如重复使用已经存在于上下文的变量来表示不同的类型;误用了内建名称来表示其他含义的名称而使之在当前命名空间被屏蔽;没有使用新建的数据类型的情况下使用类似于element、list、dict等作为变量名;使用字母小写o容易与1 混淆,1与字母L的小写。因此推荐变量名与要解决的问题域一致。有如下两个实例:
#示例1
def funA(list,num): for element in list: if num == element: return True else: return Flase
#示例2 def find_num(searchlist,num): for listValue in searchlist: if num == listValue: return True else: return False
3)不用害怕过长的变量名。为了使得程序更易理解和阅读,有的时候变量名是必要的。不要为了少写几个字母而过分缩写。下例是一个用来保存用户信息的字典结构,变量名person_info比pi的可读性要强得多。
1 >>> person_info = {'name':'John','IDCard':'131321'}
(2)深入认识Python有助于编写Pythonic代码
可以从以下几个方面入手:
1)全面掌握Python提供给我们的所有特性,包括语言特性和库特性。其中最好的学习方式应该是通读官方手册的Language Reference和Library Reference。
2)深入学习业界公认的比较Pythonic的代码,如Flask、gevent和requests等。以requests这个通过HTTP(HTTPS)协议获取网络资源的程序库为例,要获取带有Basic Auth的网络资源时,代码如下:
1 import requests 2 r = requests.get('https://api.github.com',auth=('user','pass')) 3 print(r.status_code) 4 print(r.headers[content-type])
而使用Python标准库httplib2时,代码就非常复杂,程序员需要了解相当多的关于HTTP协议和Basic Auth的知识才能编程。
1 import urllib2 2 gh_url = 'https://api.github.com' 3 req = urllib2.Request(gh_url) 4 password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() 5 password_manager.add_password(None,gh_url,'user','pass') 6 auth_manager =urllib2.HTTPBasicAuthHandler(password_manager) 7 opener = urllib2.build_opener(auth_manager) 8 urllib2.install_opener(opener) 9 handler = urllib2.urlopen(req) 10 print(handler.getcode()) 11 print(handler.headers.getheader('content-type'))
最后,除了修炼内功外,也可以尝试利用工具达到事半功倍的效果。接下介绍风格检查程序PEP8。其实一开始PEP8是一篇关于Python编码风格的指南,它提出了保持代码一致性的细节要求。它至少包括了代码布局、注释、命名规范等方面的要求。比如对代码的换行,不好的风格如下:
if foo == 'blah': do_blah_thing() do_one();do_two();do_three()
而Pythonic的风格是这样的:
if foo =='blah': do_blah_thing() do_one() do_two() do_three()
如果“人肉”检查代码是否符合PEP8规范,则比较困难,而容易跟同僚引发争论,所以有人开发了一个应用程序来进行检测,那就是PEP8应用程序。它是使用Python开发的,安装它很容易。
$ pip install -U pep8
在自己的shell中执行这一命令就可以安装成功了(首先安装pip),然后即可用它检测自己的代码。
$ pep8 --first test.py
值得注意的是,PEP8不是唯一的编程规范,同样PEP8也不是唯一的风格检测程序,类似的应用还有Pychecker、Pylint、Pyflakes等。