0.为什么需要PEP8?

PEP8存在是为了提高代码的可读性。

1.命名约定

命名样式
类型 命名约定 例子
Class 每个单词都大写字母开头;不要用下划线 Model, MyClass
Constant 使用大写字母;下划线分隔单词 CONSTANT, MY_CONSTANT,MY_LONG_CONSTANT
Package 使用小写单词;不用下划线分隔单词 package, mypackage
Function 使用小写字母;下划线分隔单词 function, my_function
Variable 使用小写字母;下划线分隔单词 x, var,my_variable
Method 使用小写字母;下划线分隔单词 class_method, method
Module 使用小写字母;下划线分隔单词 module.py, my_module.py
Package 使用小写单词;不用下划线分隔单词 package, mypackage

举例:如何选择名称?

>>> # Not recommended(反例)
>>> x = 'John Smith'
>>> y, z = x.split()
>>> print(z, y, sep=', ')
'Smith, John'
>>> # Recommended(正例)
>>> name = 'John Smith'
>>> first_name, last_name = name.split()
>>> print(last_name, first_name, sep=', ')
'Smith, John'

解释:在反例中,我们需要追踪x,y,z的内容,显然不如正例明了。

2.代码布局

空行

用两个空行的情况:函数和函数,函数和类之间的分隔

class MyFirstClass:passclass MySecondClass:passdef top_level_function():return None

用一个空行的情况:类中的函数分隔

class MyClass:def first_method(self):return Nonedef second_method(self):return None

在函数内部用少量的空格,显示清晰的步骤,如下举例:

def calculate_variance(number_list):sum_list = 0for number in number_list:sum_list = sum_list + numbermean = sum_list / len(number_list)sum_squares = 0for number in number_list:sum_squares = sum_squares + number**2mean_squares = sum_squares / len(number_list)return mean_squares - mean**2
最大行长和换行

PEP 8 建议行数应限制为 79 个字符。
隐含延续:如果代码包含在圆括号、方括号或大括号中,Python 将假定行继续。举例:

#举例1:有圆括号
def function(arg_one, arg_two,arg_three, arg_four):return arg_one# 举例2:在二元运算符之前中断
total = (first_variable+ second_variable- third_variable)

如果不能用隐含延续,用反斜杠换行:

from mypkg import example1, \example2, example3

3.缩进

PEP8的缩进规则,如下:

  • 使用4个空格缩进
  • 更喜欢空格而不是制表符(Tabs)
  • 制表符和空格不能混用
x = 3
if x > 5:print('x is larger than 5')
换行后的缩进,有两种缩进样式:
  • 第一种:将缩进块与开始分隔符对齐
#举例1
def function(arg_one, arg_two,arg_three, arg_four):return arg_one#举例2:只需要4个空格就可以与开始分隔符对齐
#这种情况多发生在if跨越多行的语句中,因为if、空格和左括号构成 4 个字符。
x = 5
if (x > 3 andx < 10):# Both conditions satisfiedprint(x)x = 5
if (x > 3 andx < 10):    # 也可以在续行上添加额外的缩进print(x)
  • 第二种:悬挂缩进
    意思是段落或语句中除了第一行之外的每一行都缩进。
#举例1:使用悬挂缩进时,第一行不能有参数
var = function(arg_one, arg_two,arg_three, arg_four)#举例2:在续行上使用双缩进,提高可读性
def function(arg_one, arg_two,arg_three, arg_four):return arg_one
放置右括号的两种方法

关键要保持一致性,两种方法二选一即可。

#方法1:将右括号与上一行第一个非空白字符对齐
list_of_numbers = [1, 2, 3,4, 5, 6,7, 8, 9]#方法2:将右括号与开始构造行的第一个字符对齐
list_of_numbers = [1, 2, 3,4, 5, 6,7, 8, 9
]

4.注释

同行注释

用 >= 2个空格 分隔语句和注释
用 1和空格 分隔#和注释内容

x = 5  # This is an inline comment
换行注释

格式:用#开头,后跟一个空格;
缩进:注释块缩进到与被描述的代码相同的级别
长度:注释长度不得超过79个字符
其他:如果注释较多,也可以对注释分段。

def quadratic(a, b, c, x):# Calculate the solution to a quadratic equation using the quadratic# formula.## There are always two solutions to a quadratic equation, x_1 and x_2.x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)return x_1, x_2
文档注释

用(""")或(’’’)

# 举例1:将结束多行注释的”“”单独放一行
def quadratic(a, b, c, x):"""Solve quadratic equation via the quadratic formula.A quadratic equation has the following form:ax**2 + bx + c = 0There always two solutions to a quadratic equation: x_1 & x_2."""x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)return x_1, x_2# 举例2:对于单行文档注释,保持“”“在同一行
def quadratic(a, b, c, x):"""Use the quadratic formula"""x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)return x_1, x_2

5.表达式和语句中的空格

当=用于为参数分配默认值时,不要用空格。
# Recommended
def function(default_parameter=5):# ...# Not recommended
def function(default_parameter = 5):# ...
当有多个运算符,在优先级最低的运算符附近加空格
# Recommended:and优先级低
if x>5 and x%2==0:print('x is larger than 5 and divisible by 2!')# Recommended:+优先级低
y = x**2 + 5
z = (x+y) * (x-y)# Not Recommended
y = x ** 2 + 5
z = (x + y) * (x - y)
一般在,后加空格
# 举例1
# Recommended
my_list = [1, 2, 3]# Not recommended
my_list = [ 1, 2, 3, ]# 举例2
# Recommended
print(x, y)# Not recommended
print(x , y)

6.编程建议

不要将bool值与等价运算符混用

# Recommended
if my_bool:return '6 is bigger than 5'# Not recommended
my_bool = 6 > 5
if my_bool == True:return '6 is bigger than 5'

任何空list,空string,空tuple都是False

# Recommended
my_list = []
if not my_list:print('List is empty!')# Not recommended
my_list = []
if not len(my_list):    # 不用判断长度print('List is empty!')

7.工具和技巧

Linters

Linter 是检查代码风格和错误的小工具。类似于word中的拼音检查,只是word检查的是自然语言,Linter检查的是机器语言。
对于Python代码的Linter第三方库:pycodestyle,flake8

自动修正

自动修正的第三方库:black

- 写在最后

边记录边学习,慢慢积累,日日提高。

一文搞懂 PEP8 代码风格相关推荐

  1. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  2. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  3. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  4. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  5. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  6. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  7. 一文搞懂CAN FD总线协议帧格式

    目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...

  8. 一文搞懂 Cocos Creator 3.0 坐标转换原理

    一文搞懂 Cocos Creator 3.0 坐标转换原理 屏幕坐标 UI 触点坐标 UI 多分辨率适配方案 UI 触点获取 不同坐标之间的转换 屏幕坐标与 3D 节点世界坐标互转 3D 节点之间的坐 ...

  9. 一文搞懂Qt中的颜色渐变(QGradient Class)

    一文搞懂Qt中的颜色渐变(QGradient Class) 1, 快速开始! Qt中与颜色渐变有关的类是QGradient 其中它又有三个子类:QLinearGradient.QRadialGradi ...

最新文章

  1. 【解决方案】本次安装Visual Studio 所用的安装程序不完整
  2. CSS 锦囊[收藏]
  3. oracle+查表物理块数,如何统计一段时间内 发生在某个表上的 物理读写的块数
  4. 在eclipse上搭建springBoot
  5. ATmega16 单片机 AVR单片机 直流电机调速器
  6. 计算机音乐b型谱简单,尤克里里入门教程_尤克里里谱大全
  7. 拳皇97c语言编码,拳皇97(格斗王97)
  8. 淘宝手淘首页金字塔流量爬升法|运营狗
  9. 解决安装PyMySQL一直停在Building wheels for collected package:cryptography, cffi, pycparser的问题...
  10. Eagle设计师必备利器管理工具
  11. flash崩溃未保存!
  12. leaflet移动图标(leaflet篇.68)
  13. Android 版本更新,支持增量更新
  14. xe6 动态元素数量
  15. 程序员的写作课:四、我们如何管理素材
  16. Gradle的卖家秀和买家秀
  17. 两种降压型DC-DC变换器的工作原理
  18. iHost 域名解析
  19. Excel2021 无法复制筛选后的合并单元格数据提示无法操
  20. 团队项目第六周——Alpha阶段项目复审

热门文章

  1. 复制两个对象字段类型一样,属性(字段名)不一样
  2. Springboot +Flowable,通过代码绘制流程图并设置高亮
  3. 图腾柱PFC入门仿真
  4. 成都发布BIM计价参考依据,明确BIM服务费计算方式——筑智建
  5. WEB前端学习课程推荐
  6. 移动流量转赠给好友_中国移动流量流量如何转赠给别人
  7. poi动态合并内容相同的单元格
  8. Java IO流 - 字节流的使用详细介绍
  9. Matlab中数值计算精度
  10. 模数转换器ADC的常用术语和主要技术指标(二)