- 引论
建议1:理解pythonic的概念
pythonic也许可以遮阳定义:充分体现python自身特色的代码风格。
python中两个变量交换只需一行:
a,b= b,a
遍历一个容器时可以为:
for i in alist: do_sth_with(i)
打开文件,需要安全的关闭文件可以为:
with open(path,’r’) as f: do_sth_with(f)
如果想倒序输出一个列表可以这样:
printlist(reversed(a))
写pythonic程序需要对标准库有充分的理解,特别是内置函数和内置数据类型。比如对于字符串格式化,一般这样写:print‘Hello%s!’%(‘Tom’)。其实%s是非常影响可读性的,因为数量多了之后,就很难分清占位符对应哪一个实参,所以pythonic的代码是这样的。
print‘hello %(name)s!’%(‘name’:’Tom’) value= {‘great’:’Hello world’,’language’:’python’} print‘%(greet)s from %(language)s.’%value print‘{greet} from {language}’.format(greet = ‘Helloworld!’,language = ‘python’)
建议2:编写pythonic代码
(1).要避免劣化代码
1避免只用大小写来区分不同的对象
2避免使用容易引起混淆的名称
3不要害怕过长的变量名
(2).深入认识python有助于编写pythonic代码
1全面掌握python提供给我们的所有特性,包括语言特性和库特性。其中最好的学习方式应该是通读官方手册中的LanguageReference和LibraryReference。
2随之python版本的更新,知识也要更新。
3深入学习业界公认比较pythonic的代码,比如Flask、gevent、requests等。
建议3:理解python与c语言的不同之处
(1).’缩进’与’{}’
python使用严格的代码缩进方式分隔代码块,所以空格和tab键不能随便敲了。
(2).’与 “
C语言中’和”是有严格区别的,在python中,单引号和双引号,仅仅在输入字符串内容的时候,存在微小差异。
(3).三元操作符’?:’
c?x:y在python中等价的形式为xif
c else y
(4).switch…case
python中没有这样的分支语句,但可以使用ifelif… else来替代。
或使用跳转表来实现
def f(x): return{ 0:”youtyped zero.\n”, 1:”youare in top.\n”, 2:”nis an even number\n”}.get(n,”only single-digit numbers areallowed\n”)
不要呗其他语言的思维和习惯困扰,掌握python的哲学和思维方式才是硬道理。
建议4:在代码中适当添加注释、
python中有3种形式的代码注释:块注释、行注释以及文档注释。这三种形式的惯用法大概有如下几种:
(1).使用块注释仅仅注释那些复杂的操作、算法,还有可能别人难以理解的技巧或者不够一目了然的代码。
(2).注释和代码隔开一定的距离,同时在块注释之后最好多留几行空白在写代码。
(3).给外部可访问的函数和方法添加文档注释。注释要清楚描述方法的功能,并对参数、返回值以及可能发生的异常进行说明,使得外部调用它的人员仅看docstring就能正常使用。
(4).推荐在文件头中包含copyright申明、模块描述等,如有必要可考虑加入作者信息以及变更记录。
建议5:通过适当添加空行使代码布局更加优雅
在一个团队中,保持良好的代码格式需要团队成员在选取一套合适的代码格式规则的基础上遵从和应用。往往代码不断修改,所有可读性直接关系到可维护性和可扩展性。
(1).在一组代码表达完一个完整思路之后,应该用空白行进行间隔。
(2).尽量保持上下文语义的易理解性,如当一个函数调用另一个函数的时候,尽量将他们放在一起,最好调用者在上,被调用者在下。
(3).避免过长的代码行,每行最好不要超过80个字符。超过的部分可以用括号进行行连接,并保持元素垂直对齐。
(4).不要为了保持水平对齐而使用多余的空格,使阅读者更容易理解代码更重要。
(5).空格的使用要能够在需要强调的时候警示读者,二元运算符左右两边应该有空格,逗号和分号前不要使用空格,函数名和左括号之间、序列索引操作时序列名和[]之间不需要空格,函数默认的参数两端不需要空格,强调前面的操作符时使用空格。
建议6:编写函数的四个原则
函数能够带来最大化的代码重用和最小化的代码冗余。一般函数设计有以下基本规则可以参考:
原则1函数设计要尽量短小,嵌套层次不宜过深。所谓短小,就是前面所提到的一样尽量避免过长函数。
原则2函数申明应该做到合理、简单、易于使用。除了函数名能反映其大体功能外,参数个数同样不宜过多。
原则3函数参数设计应该考虑向下兼容。有时候随着需求和版本的升级,需要进行一定的修改才能满足这个版本的需求,设计过程中除了着眼当前的需求还得考虑向下兼容
原则4一个函数只做一件事,尽量保持函数语句粒度的一致性。
建议7:将常量集中到一个文件
实际上python的内建命名空间是支持一小部分常量的,如我们熟悉的True、False、None等,如何使用常量呢?一般来说有两种方式。
(1).通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词,如MAX_OVERFLOW、TOTAL。这是一种约定俗成的风格。
(2).通过自定义的类实现常量功能。这要求符合“命名全部为大写”和“值一旦绑定便不可再修改”这两个条件。下面是一种常见的解决方法,它通过对常量对应的值进行修改时或者命名不符合规范时抛出异常来满足以上常量的两个条件。
#const.py class_const: classConstError(typeError): pass classConstCaseError(ConstError): pass def __setattr__(self,name,value): if self.__dict__.has_key(name): raise self.ConstError,”Can’t change const %s”%name if not name.isupper(): raise self.ConsrCaseError,’const name “%s” is not all uppercase’%name self.__dict__[name]= value import sys sys.modules[__name__]= _const()
使用时直接import const即可
import const const.COMPANY= “IBM”
无论采用哪一种方式实现常量,都提倡将常量集中到一个文件中,因为这样有利于维护,一旦需要修改常量的值,可以集中统一进行而不是逐个文件去检查。