Python代码规范
最近看了几期CSDN上面的机器学习培训,说实话,对于培训讲师的英文水平和代码规范实在不敢恭维。为什么代码规范能和英文水平联系起来呢?别忘了,我们一般都是用英文写代码的。一个人搞不清楚单复数和词形,写出来的代码看着就很难受。
如果我一直都看国内讲师的节目,也许挑不出毛病。恰好我是先看的斯坦福,coursera等课程,也看了python for data analysis等规范的教材。所以一开始就养成了良好的编程习惯。
子曰:名不正则言不顺。
作为python的机器学习工程师,首先要和其他python程序员一样遵守python代码规范。
以下是Python官方的代码规范:
https://www.python.org/dev/peps/pep-0008/
有些内容,我看了以后还是挺吃惊的。比如python对于数学公式的规范:
#正确的示范
y = a*x + b
#错误的示范
y = a * x + b
想知道为什么?自己去看。
代码规范的核心就是要让代码可读,如果代码规范会使得代码的可读性下降,那么可以不遵守代码规范。
代码规范中提到内容,这里不再重复。以下是我对代码规范的补充。
代码中的英语和语法
很多人写文章谈代码规范,都是翻译或者看了外国人写的文章,对于中国人经常犯的错误,闭口不提。但是我发现,程序员写代码用的是英语,但是却不注意英语的使用。我作为程序员兼英语老师,对这个特别有发言权。
拼写错误
程序员为了赶时间,随便就取了个名字,殊不知拼写错了。我遇到的最夸张的是,有人把Exists(存在)写成了Exit(退出)。这个小小的错误足足耽误了我半天时间,我不仅需要反复确认我的判断,还需要修改很多代码(他的这个错误到处存在)。我开玩笑说,我接手的代码到处都存在(Exist)bug,我都想退出(Exit)了。
我们都知道写错别字是不对的,但是程序员们为了赶时间,往往忽视这点。但是这样就给后来的程序员很大的困扰:改还是不改,这是个问题。
还有一类拼写错误,是反复使用一个词的时候,有一次不小心打错了。其实这样的错误是可以避免的。首先,应该避免反复使用同一个字符串。办法就是把同样的字符串放到静态变量里,或者使用枚举。
单词拼错,并不是一个英文好不好的问题。而是,程序员们工作压力太大,没有时间关心代码可读性。这反映出当今中国社会急功近利的浮躁文化。
平时单词经常读错也是导致写代码的时候写错的原因之一,这个只能靠自己了。
顺便提一下,机器学习中被中国人读错最多的就是ensemble这个单词。这个读ang-semble。这个单词CSDN的某讲师也是读错的。
词性错误
词性错误在国内也特别常见。我看到有人把方法名叫做Imputer,这明显有问题。如果他好好看过scikit-learn的代码,他应该知道Imputer这个词,肯定是个类名(大写)或者module名(小写)。
类和module是一组相关的操作(动作)的集合,类和module解决一个是什么的问题,方法解决一个干什么的问题。比如,有个类叫做水壶那么,他就会有三个方法,接水,倒水,烧水。如果你把三个方法叫做接水器,倒水器,烧水器,是不是很奇怪?
Python当中,方法名可以用名词,而当方法名是名词的时候,他相当于省略了get或者set。比如plt.title(“人口增长”),就是设置title。这个在Java当中,应该使用setTitle了,而title应该是私有的变量。
我们回过来说Imputer这个词,他肯定是个类,而他的主要方法就是impute。
再说说布尔型的变量。他肯定是个形容词,为了可读性,有时可以加上is或者has。比如isnull()函数,has_key()函数。对于数据挖掘的数据,我会分为categorical和continuous,我没有加is,我觉得这已经很清楚了,加is画蛇添足。
接着前面的has,说说第三人称的问题。国内很多人写代码,容易把has写成have,Exists写出Exist。这里为什么要用第三人称呢?这个问题好像我也回答不了。你可以这样理解:The dict has the key ‘a’。但是为什么impute不是imputes?正确的英语应该是:The imputer imputes the data。根据我的观察,如果返回值是布尔型的,函数使用第三人称。我没见过任何一个编码规范这样说,但是大家实际上都是这么做的。
词性 | 适用于 |
---|---|
名词 | 类名,module名,变量名,方法名 |
动词 | 方法名 |
第三人称动词 | 方法名,返回值是布尔型 |
形容词 | 布尔型变量名,布尔型函数名 |
下表给出python中各种成员的命名语法ÿ