Python编程风格指南

一、前言

1. 为什么要编程规范?

编程规范一方面便于自己以后的阅读和修改,另一方面方便别人阅读和理解,很多时候我们都需要团队合作,所以编程风格统一对于提高效率非常重要!Python的世界,我们要追求Pythonic,尽可能的优雅,代码就是我们的形象!

2. 如何选择编程规范?

这里需要分类对待

  1. 如果你是修改别人的项目,那么最简单的就是看看别人的代码,别人怎么写,我就怎么写,保证整个项目代码风格的完整性和一致性。可以模仿好的开源项目的代码风格
  2. 自己从头开始写的项目,那么就遵守PEP8Python代码指南Google Python 风格指南
  3. 如果自己的组织内部有规定,那么就按照组织规定来。
    下面就以自己从头开始编写项目,参照PEP8 Python代码指南Google Python 风格指南列出一些主要的、简单的原则。

二、Python编程规范建议

1. 缩进

Python中有着严格的缩进,建议用4个空格来缩进代码,绝对不要混合使用tabs和空格!Python3中已经禁止混合使用tabs和空格!

2. 注释

最需要写注释的是代码中那些技巧性的部分. 对于复杂的操作, 应该在其操作开始前写上若干行注释. 对于不是一目了然的代码, 应在其行尾添加注释.
绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么.

  1. 行注释以#开头,如:# This is a comment.
  2. 代码后的注释,为了提高可读性,注释应该至少离开代码2个空格。如:if i & (i-1) == 0: # True if i is 0 or a power of 2.
  3. 文档字符串的规则参见参考资料。

3. 空格的使用

  1. 括号内不要有空格.Yes: spam(ham[1], {eggs: 2}, [])
  2. 不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾). Yes: if x == 4: No: if x == 4 :
  3. 参数列表, 索引或切片的左括号前不应加空格.Yes: spam(1) No: spam (1)
  4. 在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <=, >=, 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)
  1. 当’=’用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.
# Yes
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
  1. 不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):
# Yes
x = 1
y = 2
long_variable = 3

4. 导入格式

导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组:

  1. 标准库导入
  2. 第三方库导入
  3. 应用程序指定导入
    每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.
    每个导入单独占一行。不建议全部放在一行。
# 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.

应该避免的名称

  1. 单字符名称, 除了计数器和迭代器.
  2. 包/模块名中的连字符(-)
  3. 双下划线开头并结尾的名称(Python保留, 例如__init__)
  4. 避免用’l’和‘O’作为单字符变量。因为它们跟数字’1’和’0’很像,容易出错。

命名约定

  1. 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的.
  2. 用单下划线(_)开头表示模块变量或函数是protected的(使用from module import *时不会包含).
  3. 用双下划线(__)开头的实例变量或方法表示类内私有.
  4. 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
  5. 对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py). 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名, 但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.

Python之父Guido推荐的规范

TypePublicInternal
Moduleslower_with_under_lower_with_under
Packageslower_with_under
ClassesCapWords_CapWords
ExceptionsCapWords
Functionslower_with_under()_lower_with_under()
Global/Class ConstantsCAPS_WITH_UNDER_CAPS_WITH_UNDER
Global/Class Variableslower_with_under_lower_with_under
Instance Variableslower_with_under_lower_with_under (protected) or __lower_with_under (private)
Method Nameslower_with_under()_lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameterslower_with_under
Local Variableslower_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. 空行

顶级定义之间空两行, 方法定义之间空一行
顶级定义之间空两行, 比如函数或者类定义. 方法定义, 类定义与第一个方法之间, 都应该空一行. 函数或方法中, 某些地方要是你觉得合适, 就空一行.
小伙伴们如果想看更多更详细的请移步参考资料进行阅读学习。

三、参考资料

  1. PEP8Python代码指南
  2. Google Python 风格指南
  3. Google Python Style Guide

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
每日学一技

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值