Python编程风格指南
一、前言
1. 为什么要编程规范?
编程规范一方面便于自己以后的阅读和修改,另一方面方便别人阅读和理解,很多时候我们都需要团队合作,所以编程风格统一对于提高效率非常重要!Python的世界,我们要追求Pythonic,尽可能的优雅,代码就是我们的形象!
2. 如何选择编程规范?
这里需要分类对待
- 如果你是修改别人的项目,那么最简单的就是看看别人的代码,别人怎么写,我就怎么写,保证整个项目代码风格的完整性和一致性。
可以模仿好的开源项目的代码风格
。 - 自己从头开始写的项目,那么就遵守PEP8Python代码指南和Google Python 风格指南。
- 如果自己的组织内部有规定,那么就按照组织规定来。
下面就以自己从头开始编写项目,参照PEP8 Python代码指南
和Google Python 风格指南
列出一些主要的、简单的原则。
二、Python编程规范建议
1. 缩进
Python中有着严格的缩进,建议用4个空格来缩进代码
,绝对不要混合使用tabs和空格!Python3中已经禁止混合使用tabs和空格!
2. 注释
最需要写注释的是代码中那些技巧性的部分. 对于复杂的操作, 应该在其操作开始前写上若干行注释. 对于不是一目了然的代码, 应在其行尾添加注释.
绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么.
- 行注释以
#
开头,如:# This is a comment.
- 代码后的注释,为了提高可读性,注释应该至少离开代码2个空格。如:
if i & (i-1) == 0: # True if i is 0 or a power of 2.
- 文档字符串的规则参见参考资料。
3. 空格的使用
- 括号内不要有空格.
Yes: spam(ham[1], {eggs: 2}, [])
- 不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).
Yes: if x == 4:
No: if x == 4 :
- 参数列表, 索引或切片的左括号前不应加空格.
Yes: spam(1)
No: spam (1)
- 在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <=, >=, in, not in, is, is not), 布尔(and, or, not). 多种不同操作符存在时,在最低级的操作符两边加上空格。这个需要你好好判断,不要要保证操作符两侧的空格一致。
# Yes
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
- 当’=’用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.
# Yes
def complex(real, imag=0.0):
return magic(r=real, i=imag)
- 不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):
# Yes
x = 1
y = 2
long_variable = 3
4. 导入格式
导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组:
- 标准库导入
- 第三方库导入
- 应用程序指定导入
每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.
每个导入单独占一行。不建议全部放在一行。
# Yes
import os
import sys
# No
import os, sys
5. 命名
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name.
应该避免的名称
- 单字符名称, 除了计数器和迭代器.
- 包/模块名中的连字符(-)
- 双下划线开头并结尾的名称(Python保留, 例如__init__)
- 避免用’l’和‘O’作为单字符变量。因为它们跟数字’1’和’0’很像,容易出错。
命名约定
- 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的.
- 用单下划线(_)开头表示模块变量或函数是protected的(使用from module import *时不会包含).
- 用双下划线(__)开头的实例变量或方法表示类内私有.
- 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
- 对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py). 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名, 但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.
Python之父Guido推荐的规范
Type | Public | Internal |
---|---|---|
Modules | lower_with_under | _lower_with_under |
Packages | lower_with_under | |
Classes | CapWords | _CapWords |
Exceptions | CapWords | |
Functions | lower_with_under() | _lower_with_under() |
Global/Class Constants | CAPS_WITH_UNDER | _CAPS_WITH_UNDER |
Global/Class Variables | lower_with_under | _lower_with_under |
Instance Variables | lower_with_under | _lower_with_under (protected) or __lower_with_under (private) |
Method Names | lower_with_under() | _lower_with_under() (protected) or __lower_with_under() (private) |
Function/Method Parameters | lower_with_under | |
Local Variables | lower_with_under |
6. 字符串
在同一个文件中, 保持使用字符串引号的一致性. 使用单引号’或者双引号”之一用以引用字符串, 并在同一文件中沿用. 在字符串内可以使用另外一种引号, 以避免在字符串中使用.
即使参数都是字符串, 使用%操作符或者格式化方法格式化字符串. 不过也不能一概而论, 你需要在+和%之间好好判定.
避免在循环中用+和+=操作符来累加字符串. 由于字符串是不可变的, 这样做会创建不必要的临时对象, 并且导致二次方而不是线性的运行时间. 作为替代方案, 你可以将每个子串加入列表, 然后在循环结束后用 .join 连接列表.
7. 语句
通常每个语句单独占一行,尽量不要把多行语句写在一行。
8. Main
即使是一个打算被用作脚本的文件, 也应该是可导入的. 并且简单的导入不应该导致这个脚本的主功能(main functionality)被执行, 这是一种副作用. 主功能应该放在一个main()函数中.
在Python中, pydoc以及单元测试要求模块必须是可导入的. 你的代码应该在执行主程序前总是检查 if __name__ == '__main__'
, 这样当模块被导入时主程序就不会被执行.
def main():
pass
if __name__ == '__main__‘:
main()
所有的顶级代码在模块导入时都会被执行. 要小心不要去调用函数, 创建对象, 或者执行那些不应该在使用pydoc时执行的操作.
9. 类
如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.
# Yes
class SampleClass(object):
pass
class OuterClass(object):
class InnerClass(object):
pass
class ChildClass(ParentClass):
"""Explicitly inherits from another class already."""
继承自 object 是为了使属性(properties)正常工作, 并且这样可以保护你的代码, 使其不受 PEP-3000 的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方法实现了对象的默认语义, 包括 __new__
, __init__
,__delattr__
, __getattribute__
,__setattr__
,__hash__
,__repr__
, and __str__
.
10. 空行
顶级定义之间空两行, 方法定义之间空一行
顶级定义之间空两行, 比如函数或者类定义. 方法定义, 类定义与第一个方法之间, 都应该空一行. 函数或方法中, 某些地方要是你觉得合适, 就空一行.
小伙伴们如果想看更多更详细的请移步参考资料进行阅读学习。
三、参考资料
后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技
,扫描下方二维码或者搜索每日学一技
关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!