如何把 Python 代码写得优雅?

​同样的功能,你可以使用不同的代码方式来实现,它们,都可以跑的起来,而在背后的那些「跳动」着的代码,有的美如诗,有的丑如屎…如果说,代码是有生命的,那么你希望它是温柔的天仙,还是抠脚的大汉?

你在 Python 环境中, import 一下 this,浮现出来的是一首诗,前部分是:

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested. Sparse is better than dense.

Readability counts.

你看这 Python 的思想,要的就是简洁,漂亮,可读性好…

为了让你团队之间合作得愉快,为了让你我心情好一点,为了你的幸福,我想还是有必要跟你说说:

如何避免把 Python 代码写得跟屎一样。。。

那么接下来就是学习 Python 的正确姿势

关于名称

在写代码的时候,我们有很多地方需要定义名称,比如常用到就有变量的名称,类的名称,方法的名称,参数的名称等等…如何才能写好它们呢?

类名

有一种命名法叫「大驼峰式命名法」:

每一个单字的首字母都采用大写字母,例如:FirstName、LastName、CamelCase,也被称为Pascal命名法(英语:Pascal Case)。

在 Python 中起类名最好就是使用这种方式,比如:MyClass,FxxkPython。

还有一点要注意的是,有些单词本身就是缩写的,比如:

HTML = HyperText Markup Language

HTTP = HyperText Transfer Protocol

那么在写含有这些单词的类名时,也是需要大写的:HTTPServerError而不是:HttpServerError

方法名和变量名

方法名和变量名尽量全使用小写字母,如果名称中的单词多,可以使用「_」来分割,比如:

firstname,lastname,extract_data,file,age,name….

模块名称

模块名称也是全使用小写字母,使用「_」来分割,比如:

fxxk.py,fxxk_python.py

包名

包名使用小写字母,但不建议使用「_」来分割,比如:

package,mypackage

常量

常量名称使用全大写字母,使用「_」来分割,比如:

MAXNUM,MYCONSTANT,CONSTANT

关于注释

在 Python 代码中写注释有几种,比如在代码块注释,在行内注释,写文档的注释。几个写注释的好习惯:

代码注释使用 # 开头,并在后面空一格才开始写

每一行不要超过 72 个字符,适当使用 # 分行

注释要和代码对齐

每一段应该空一行出来

行内注释

注意空格:

代码块多行注释

注意对齐:

注意换行:

文档字符串

除了解释代码的行为,我们有时候还需要写代码的「功能使用文档」,有了文档别人才能更好的使用你写的功能,通常我们会在代码里面写 DocStrings。

写 DocStrings 的习惯方式是这样的:

Docstrings 应该是在「类」或「函数定义下」的第一行开始声明

Docstrings 应该是用 “”” 开头, “”” 结尾

Docstrings 第一行的描述尽量简短并且能让人一下子就知道说的是什么

第二行起需要空格

每一段描述之间需要有空格 和代码对齐

每一行不要超过 72 个字符

像这样:

当然,DocStrings 还有别的风格,比如常见的还有 Google 和 Numpy 的风格。你可以在这里找到它们的例子:

https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html#example-numpy

关于代码

其实写代码和写文章有点相似,文章要让人看得下去,起码要有点排版,什么地方应该加空格,什么地方应该换行,字与字之间的间距多少才好?行与行之间的间距多少才好?什么地方留白?(你看我公众号的排版,是不是用心了?)

代码也是一样的,不要什么都特么堆在一起。

类与类之间要空两行

类与顶层方法之间也要空两行

类中的方法之间要空一行

不同的逻辑代码之间空一行

比如 for,if 这些具有逻辑性的语句之间,可以空一行,这样可以让逻辑看起来更加清晰:

代码的缩近

关于代码的缩进可能大部分 b 友喜欢用 Tab 键,不过更好的缩进方式是「连续 4 个空格」。

在使用 Python2 那会你还可以 Tab 和空格混合使用,不过在 Python3 之后不可以这样,缩进的方式要保持一致,最好都是「连续 4 个空格」。

如果你已经习惯了 Tab 来缩进,也没关系,大部分编辑器都可以自定义按 Tab 的时候,给你转换成「连续 4 个空格」。

代码的换行

在写代码的时候,要记得换行,每行代码最好不要超过 79 个字符。对于一些字典,列表,元组,函数等这些含有 () [] {},可以直接回车换行,并垂直对齐:

有时候为了美观大方,你可以把括号的结尾另起一行:

如果含有运算符,建议换行的时候把符号放在前面:

其它的你可以使用反斜杠换行:

代码的空格在以下这些运算操作符的两边,需要加个空格。

运算: + _ * = += -= 等

比较: ==, <, >, !=, <>, <=, >=, in, not in, is, is not

布尔: and, or, not

不过,如果代码中含有多个运算,那么可以直接在最低优先级的地方添加空格:

对于函数的参数默认赋值,也不需要添加空格:

在冒号,分号,逗号后面加空格,前面不要加空格(切片中的冒号除外):

紧靠 ()、[]、{} 不要加空格 :

在函数调用和索引使用时不要加空格:

关于 import

在文件的顶部,我们写 import 的语句,具有如下顺序:

从标准内置库开始导入,接着是第三方库,最后导入的是自己本地写的库,并且分好组,之间空一行。import 语句要换行,不要写在一行上:

但是从一个库中导入具体的类,就可以在写在一行上:

OK,以上就是小帅b今天给你带来的分享,我想这些都是你会经常操作到的东西,如果你想要了解更多如何把 Python 写的优雅,可以看看官网的 PEP8 介绍。

当然,也有一些插件可以使用,它们可以格式化你的代码,比如 vim-autopep8,或者一些库也可以检查你的代码是否符合规范,比如 pylint,pycodestyle 等,不过小帅b还是建议你自己在写代码的时候多养成以上这些好习惯,而不是靠插件来帮你格式化那些 shit。

也许有些人并不在意这些,觉得可读性没什么,那就让他们随意就好。不过你都看到这里了,说明你还是对某方面有细节上的追求,那么咱们就一点一点改进呗,对你总会有好处的。

之前在某个群上,有位不认识的朋友看到了我的代码,他夸我的那句话我到现在还记得:「你的代码看起来好舒服啊」,这「舒服」两个字就像你给我点赞分享那样开心。。。我之所以开心且记得,是因为他看到了我注重的细节。

说不定哪天,因为某个细节,你就脱「引」而出,那可真是帅啊!

发表回复