Python 中的 PEP 8 的用途是什么?

在本教程中,我们将学习什么是 PEP-8,以及如何在 Python 编码中使用它。我们将讨论在编程中使用 PEP 的指导原则——本教程面向初学者到中级。我们还将讨论在编码时使用 PEP-8 的好处。

什么是 PEP?

PEP 是 Python 企业建议书的缩写形式。编写具有适当逻辑的代码是编程的一个关键因素,但许多其他重要因素也会影响代码的质量。开发人员的编码风格使代码更加可靠,每个开发人员都应该记住 Python 严格遵循字符串的顺序和格式。

自适应良好的编码风格使代码更易读。代码对最终用户来说变得容易了。

PEP 8 是一个文档,提供了用 Python 编写可读代码的各种指南。PEP 8 描述了开发人员如何编写漂亮的代码。它是由吉多·范·罗苏姆、巴里·华沙和尼克·科格兰在 2001 年正式撰写的。PEP 的主要目的是增强代码的可读性和一致性。

为什么 PEP 8 很重要?

PEP 8 增强了 Python 代码的可读性,但是为什么可读性这么重要呢?让我们理解这个概念。

Python 的创造者吉多·范·罗苏姆说:“代码比写出来的要多得多。”代码可以在几分钟、几个小时或者一整天内写完,但是一旦我们写完了代码,就再也不会重写了。但是有时候,我们需要一遍又一遍地阅读代码。

在这一点上,我们必须知道为什么要在代码中写下这一行。代码应该反映每一行的意思。这就是可读性如此重要的原因。

我们将描述一些重要的指导方针,用于编写其他人也能阅读的有效代码。

命名约定

当我们编写代码时,我们需要给很多东西命名,比如变量、函数、类、包等等。选择一个合适的名字会节省时间和精力。当我们一段时间后回头看文件时,我们可以很容易地回忆起某个变量、函数或类代表了什么。开发者应该避免选择不合适的名字。

Python 中的命名约定略显混乱,但有一些约定我们可以轻松遵循。让我们看看下面的命名约定。

示例-

单个小写字母


a = 10

单个大写字母


A = 10

小写字母


var = 10

带下划线的小写字母


number_of_apple = 5

大写字母


VAR = 6

大写带下划线


NUM_OF_CARS =20 

大写单词


NumberOfBooks = 100

注意:在 CapWords 中使用缩写时,请将缩写的所有字母大写。因此,httpservereror 比 httpservereror 更好。

名称样式

下表指定了 Python 中一些常见的命名风格。请考虑下表。

| 类型 | 命名约定 | 例子 | | 功能 | 我们应该使用小写单词或者用下划线分隔单词。 | 我的函数,我的函数 | | 可变的 | 我们应该使用小写字母、单词或单独的单词来增强可读性。 | 变量名称 | | 班级 | 类名第一个字母要大写;使用骆驼案例。不要用下划线分隔单词。 | 我的类、表单、模型 | | 方法 | 我们应该使用小写字母、单词或单独的单词来增强可读性。 | 类 方法,方法 | | 常数 | 我们应该使用简短的大写字母、单词或单独的单词来增强可读性。 | MYCONSTANT,my constant 常数-my 常数 | | 组件 | 我们应该使用小写字母、单词或单独的单词来增强可读性。 | Module_name.py,module.py | | 包裹 | 我们应该使用小写字母、单词或单独的单词来增强可读性。不要用下划线分隔单词。 | 包,我的包, |

以上是一些常见的命名约定,有助于美化 Python 代码。为了进一步改进,我们应该仔细选择名称。

代码布局

代码布局定义了代码的可读性。在本节中,我们将学习如何使用空白来提高代码的可读性。

刻痕

与其他编程语言不同,缩进用于定义 Python 中的代码块。缩进是 Python 编程语言的重要部分,它决定了代码行的级别。一般来说,我们使用 4 个空格进行缩进。让我们理解下面的例子。

示例-


x = 5
if x ==  5:
    print('x is larger than 5')

在上例中,如果 if语句 的条件为真,缩进打印语句将被执行。这个缩进定义了代码块,并告诉我们当调用函数或条件触发器时执行什么语句。

  • 标签与空间

我们也可以使用标签提供连续的空格来表示缩进,但是白色空格是最可取的。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_marks

Python 允许我们在二进制运算符之前或之后换行,只要约定在本地一致。

导入模块

我们应该导入分隔线中的模块,如下所示。


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
  • 在函数内部使用空行- 有时候,我们需要编写一个复杂的函数有由几个步骤组成的 return 语句。所以我们可以在每一步之间加上空行。让我们理解下面的例子。

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, ]

示例- 3


x = 5
y = 6

# Recommended
print(x, y)

# Not recommended
print(x , y)

编程建议

我们知道,在 Python 中有几种方法可以执行类似的任务。在本节中,我们将看到 PEP 8 为提高一致性而提出的一些建议。

避免使用等价运算符比较布尔值


# Not recommended
bool_value = 10 > 5
if bool_value == True:
    return '10 is bigger than 5'

我们不应该使用等价运算符==来比较布尔值。它只能取真或假。让我们看看下面的例子。


# 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 不是无,如下例所示。


# Recommended
if x is not None:
    return 'x exists!'

第二种选择是评估 x 是否为无以及 if语句是否基于非结果。


# Not recommended
if not x is None:
    return 'x exists!'

这两个选项都是正确的,但是第一个选项很简单,所以 PEP 8 鼓励它。

结论

我们已经讨论了 PEP 8 准则,以使代码消除歧义并增强可读性。这些准则改进了代码,尤其是在与潜在的员工或合作者共享代码时。我们已经讨论了什么是 PEP 以及为什么使用它,如何编写符合 PEP 8 的代码。此外,我们还简要介绍了命名约定。如果您想了解更多关于 PEP 8 的信息,您可以阅读完整的文档或访问PEP8.org。


本文链接:https://my.lmcjl.com/post/13262.html

展开阅读全文

4 评论

留下您的评论.