一文搞懂 PEP8 代码风格
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 代码风格相关推荐
- 一文搞懂 Python 的 import 机制
一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...
- python语言语句快的标记是什么_一文搞懂Python程序语句
原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...
- 一文搞懂 Java 线程中断
转载自 一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...
- 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm
***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
- 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass
本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...
- 一文搞懂CAN FD总线协议帧格式
目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...
- 一文搞懂 Cocos Creator 3.0 坐标转换原理
一文搞懂 Cocos Creator 3.0 坐标转换原理 屏幕坐标 UI 触点坐标 UI 多分辨率适配方案 UI 触点获取 不同坐标之间的转换 屏幕坐标与 3D 节点世界坐标互转 3D 节点之间的坐 ...
- 一文搞懂Qt中的颜色渐变(QGradient Class)
一文搞懂Qt中的颜色渐变(QGradient Class) 1, 快速开始! Qt中与颜色渐变有关的类是QGradient 其中它又有三个子类:QLinearGradient.QRadialGradi ...
最新文章
- 【解决方案】本次安装Visual Studio 所用的安装程序不完整
- CSS 锦囊[收藏]
- oracle+查表物理块数,如何统计一段时间内 发生在某个表上的 物理读写的块数
- 在eclipse上搭建springBoot
- ATmega16 单片机 AVR单片机 直流电机调速器
- 计算机音乐b型谱简单,尤克里里入门教程_尤克里里谱大全
- 拳皇97c语言编码,拳皇97(格斗王97)
- 淘宝手淘首页金字塔流量爬升法|运营狗
- 解决安装PyMySQL一直停在Building wheels for collected package:cryptography, cffi, pycparser的问题...
- Eagle设计师必备利器管理工具
- flash崩溃未保存!
- leaflet移动图标(leaflet篇.68)
- Android 版本更新,支持增量更新
- xe6 动态元素数量
- 程序员的写作课:四、我们如何管理素材
- Gradle的卖家秀和买家秀
- 两种降压型DC-DC变换器的工作原理
- iHost 域名解析
- Excel2021 无法复制筛选后的合并单元格数据提示无法操
- 团队项目第六周——Alpha阶段项目复审