Python教程-Python中的PEP 8 | PEP 8在Python中的目的是什么?
在本教程中,我们将学习什么是PEP-8以及如何在Python编程中使用它。我们将讨论使用PEP进行编程的准则-这个教程旨在面向初学者到中级开发者。我们还将讨论在编程时使用PEP-8的好处。
什么是PEP?
PEP是Python Enterprise Proposal的缩写。编写具有正确逻辑的代码是编程的关键因素,但许多其他重要因素可以影响代码的质量。开发者的编码风格使代码更加可靠,每个开发者都应该记住,Python严格遵循字符串的顺序和格式。
采用良好的编码风格使代码更易读。代码变得对终端用户更容易理解。
PEP 8是一份提供有关如何在Python中编写可读代码的文档。PEP 8描述了开发者如何编写漂亮的代码。它由Guido van Rossum、Barry Warsaw和Nick Coghlan于2001年正式编写。PEP的主要目的是增强代码的可读性和一致性。
为什么PEP 8很重要?
PEP 8增强了Python代码的可读性,但为什么可读性如此重要?让我们理解这个概念。
Python的创建者Guido van Rossum说过:“代码更经常被阅读而不是被编写。”代码可以在几分钟、几小时或一整天内编写,但一旦编写完毕,我们将不会再次重写它。但有时,我们需要一遍又一遍地阅读代码。
在这一点上,我们必须知道为什么我们在代码中编写了特定的行。代码应该反映出每一行的含义。这就是可读性如此重要的原因。
我们将描述一些编写可读性强的代码的重要准则,这样其他人也可以阅读代码。
命名约定
当我们编写代码时,需要为许多事物分配名称,如变量、函数、类、包等等。选择合适的名称将节省时间和精力。当我们一段时间后回顾文件时,我们可以轻松地回想起某个变量、函数或类代表的是什么。开发者应避免选择不合适的名称。
Python中的命名约定略微混乱,但有一些约定可以轻松遵循。让我们看看以下命名约定。
示例 -
单个小写字母
a = 10单个大写字母
A = 10 小写
var = 10 使用下划线分隔的小写字母
number_of_apple = 5大写
VAR = 6使用下划线分隔的大写字母
NUM_OF_CARS =20首字母大写的单词(或驼峰式命名)
NumberOfBooks = 100注意:在CapWords中使用缩写时,大写所有缩写的字母。因此,HTTPServerError比HttpServerError更好。
名称风格
以下是Python中一些常见的命名风格的表格。考虑以下表格。
| 类型 | 命名约定 | 示例 |
|---|---|---|
| 函数 | 我们应该使用小写字母或使用下划线分隔单词。 | myfunction, my_function |
| 变量 | 我们应该使用小写字母、单词或使用下划线分隔单词来增强可读性。 | a, var, variable_name |
| 类 | 类名的首字母应该大写;使用驼峰式命名法。不要使用下划线分隔单词。 | MyClass, Form, Model |
| 方法 | 我们应该使用小写字母、单词或使用下划线分隔单词来增强可读性。 | class_method, method |
| 常量 | 我们应该使用短的大写字母、单词或使用下划线分隔单词来增强可读性。 | MYCONSTANT, CONSTANT, MY_CONSTANT |
| 模块 | 我们应该使用小写字母、单词或使用下划线分隔单词来增强可读性。 | Module_name.py, module.py |
| 包 | 我们应该使用小写字母、单词或使用下划线分隔单词来增强可读性。不要使用下划线分隔单词。 | package, mypackage |
以上是一些通用的命名约定,有助于美化Python代码。为了进一步提高代码质量,我们应该谨慎选择名称。
代码布局
代码布局定义了代码的可读性。在本节中,我们将学习如何使用空格来提高代码的可读性。
缩进
与其他编程语言不同,Python中使用缩进来定义代码块。缩进是Python编程语言的重要部分,它决定了代码的行级别。通常情况下,我们使用4个空格进行缩进。让我们理解以下示例。
示例 -
x = 5
if x == 5:
print('x is larger than 5')在上面的示例中,如果if语句的条件为真,那么缩进的打印语句将被执行。这个缩进定义了代码块,并告诉我们在调用函数或触发条件时执行哪些语句。
- 制表符 vs. 空格
我们还可以使用*制表符*来提供连续的空格以指示缩进,但更推荐使用空格。Python 2允许制表符和空格混合使用,但在Python 3中会出现错误。
换行后的缩进
在使用换行连续时使用缩进是必要的,以确保将行保持在79个字符以下。这样可以灵活确定两行代码之间的差异以及扩展为两行的单行代码。让我们理解以下示例。
示例 -
# Correct Way:
# Aligned with opening delimiter.
obj = func_name(argument_one, argument_two,
argument_three, argument_four 我们可以使用以下结构。
# first line doesn't has any argument
# We add 4 spaces from the second line to discriminate arguments from the rest.
def function_name(
argument_one, argument_two, argument_three,
argument_four):
print(argument_two)
# 4 space indentation to add a level.
foo = long_function_name(
var_one, var_two,
var_three, var_four) 使用文档字符串
Python提供了两种类型的文档字符串或文档字符串 - 单行文档字符串和多行文档字符串。我们使用三重引号来定义单行或多行文档字符串。基本上,这些用于描述函数或特定程序。让我们理解以下示例。
示例 -
def add(a, b):
"""This is simple add method"""
"""This is
a
simple add program to add
the two numbers. """ 二元运算符之前或之后是否应换行?
二元运算符之前或之后的换行是一种传统的做法。但这会极大地影响可读性,因为运算符分散在不同的屏幕上,每个运算符都远离其操作数并位于前一行上。让我们理解以下示例。
示例 -
# Wrong:
# operators sit far away from their operands
marks = (engilsh_marks +
math_marks +
(science_marks - biology_marks) +
Physics_marks 正如我们在上面的示例中所看到的,这似乎读起来相当混乱。我们可以通过使用以下结构来解决此类问题。
示例 -
# Correct:
# easy to match operators with operands
Total_marks = (English_marks
+ math_marks
+ (science_marks - biology_marks)
+ physics_marksPython允许我们在二元运算符之前或之后换行,只要在局部保持一致即可。
导入模块
我们应该在单独的行上导入模块,如下所示。
import pygame
import os
import sys错误的方式
import sys, os我们还可以使用以下方法。
from subprocess import Popen, PIPE导入语句应该写在文件顶部或任何模块注释后面。绝对导入是推荐的,因为它们更可读,而且更易于处理。
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example但是,特别是在处理复杂的包时,我们可以使用显式的相对导入来代替绝对导入。
空白行
空白行可以提高Python代码的可读性。如果许多代码行挤在一起,代码将变得难以阅读。我们可以通过使用许多空白垂直线来解决这个问题,读者可能需要滚动更多次才能看到全部内容。请按照以下说明添加垂直空白。
- 顶级函数和类的两行 - 围绕它们放置额外的垂直空间,以便能够理解。
class FirstClass:
pass
class SecondClass:
pass
def main_function():
return None - 类内部单个空白行 - 我们在类中定义的函数彼此相关。让我们看看以下示例 -
class FirstClass:
def method_one(self):
return None
def second_two(self):
return None - 在函数内部使用空白行 - 有时,我们需要编写复杂的函数,包括返回语句之前的几个步骤。因此,我们可以在每个步骤之间添加空白行。让我们理解以下示例。
def cal_variance(n_list):
list_sum = 0
for n in n_list:
list_sum = list_sum + n
mean = list_sum / len(n_list)
square_sum = 0
for n in n_list:
square_sum = square_sum + n**2
mean_squares = square_sum / len(n_list)
return mean_squares - mean**2上述方式可以消除空白,提高代码的可读性。
放置闭合括号
我们可以使用行连续性来打破括号和方括号内的行。PEP 8允许我们使用闭合括号来表示行连续性。让我们理解以下示例。
- 将闭合括号与第一个非空格对齐。
list_numbers = [
5, 4, 1,
4, 6, 3,
7, 8, 9
] - 将闭合括号与行的第一个字符对齐。
list_numbers = [
5, 4, 1,
4, 6, 3,
7, 8, 9
] 两种方法都适用,但一致性很重要,所以选择任何一种并继续使用它。
注释
注释是任何编程语言的重要部分。这是解释代码的最佳方式。当我们使用适当的注释记录我们的代码时,任何人都可以理解代码。但我们应该记住以下几点。
- 以大写字母开头,编写完整的句子。
- 在代码发生变化时更新注释。
- 将注释和文档字符串的行长度限制为72个字符。
块注释
块注释是小节代码的好选择。当我们编写多行代码以执行单个操作,如迭代循环时,此类注释非常有用。它们帮助我们理解代码的目的。
PEP 8提供了以下编写块注释的规则。
- 缩进块注释应该在同一级别。
- 每行以#开头,后跟一个空格。
- 使用单个#分隔行。
让我们看看以下代码。
for i in range(0, 5):
# Loop will iterate over i five times and print out the value of i
# new line character
print(i, '\n') 我们可以使用多个段落来描述技术代码。让我们看看以下示例。
内联注释
内联注释用于解释代码片段中的单个语句。我们可以快速了解为什么编写了特定的代码行。PEP 8为内联注释指定了以下规则。
- 以#和一个空格开头的注释。
- 谨慎使用内联注释。
- 我们应该将内联注释与它们引用的语句放在同一行上。
以下是内联注释的示例。
a = 10 # The a is variable that holds integer value. 有时,我们可以使用命名约定来替代内联注释。
x = 'Peter Decosta' #This is a student name我们可以使用以下命名约定。
Student_name = 'Peter Decosta'内联注释很重要,但块注释可以使代码更具可读性。
避免不必要的空格
在某些情况下,使用空格可能会使代码难以阅读。太多的空格可能会使代码过于稀疏并难以理解。我们应该避免在行尾添加空格。这被称为尾随空格。
让我们看看以下示例。
示例 - 1
# Recommended
list1 = [1, 2, 3]
# Not recommended
List1 = [ 1, 2, 3, ] 示例 - 2
x = 5
y = 6
# Recommended
print(x, y)
# Not recommended
print(x , y) 编程建议
正如我们所知,Python有多种执行相似任务的方法。在本节中,我们将看到PEP 8的一些建议,以提高一致性。
避免使用等价运算符比较布尔值
我们不应该使用等价运算符==来比较布尔值。它只能接受True或False。让我们看看以下示例。
# Not recommended
bool_value = 10 > 5
if bool_value == True:
return '10 is bigger than 5' 我们不应该使用等价运算符==来比较布尔值。它只能接受True或False。让我们看看以下示例。
# Recommended
if my_bool:
return '10 is bigger than 5' 这种方法更简单,因此PEP 8鼓励使用它。
空序列在if语句中被视为假
如果我们想要检查给定的列表是否为空,可能需要检查列表的长度,因此我们需要避免以下方法。
# Not recommended
list1 = []
if not len(list1):
print('List is empty!') 然而,如果存在空列表、集合或元组,我们可以使用以下方式进行检查。
# Recommended
list1 = []
if not list1:
print('List is empty!') 第二种方法更为合适,这也是为什么PEP 8鼓励使用它的原因。
不要在if语句中使用not is
有两种选项来检查变量是否具有定义的值。第一种选项是使用x is not None,如以下示例所示。
# Recommended
if x is not None:
return 'x exists!' 第二种选项是根据not的结果来评估x is None和if语句。
# Not recommended
if not x is None:
return 'x exists!' 这两种选项都是正确的,但第一种选项更简单,因此PEP 8鼓励使用它。
结论
我们已经讨论了PEP 8的指南,以消除代码中的歧义并增强可读性。这些准则提高了代码的质量,特别是在与潜在员工或合作者共享代码时。我们已经讨论了PEP是什么以及为什么要使用它,以及如何编写符合PEP 8的代码。