PEP 8在Python中的作用是什么

PEP 8在Python中的作用是什么

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

什么是PEP

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

采用良好的编码风格使代码更易读,代码对最终用户更容易理解。

PEP 8是一份提供了编写可读的Python代码的各种准则的文档。PEP 8描述了开发人员如何编写漂亮的代码。它于2001年由Guido van Rossum,Barry Warsaw和Nick Coghlan正式编写。 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语句 的条件为真,则缩进的打印语句将被执行。这个缩进定义了代码块,并告诉我们当函数被调用或条件触发时哪些语句被执行。

  • 制表符与空格

我们也可以使用 制表符 来提供连续的空格以指示缩进,但空格是最可取的。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)

使用docstring

Python提供了两种类型的 文档字符串或docstring - 单行和多行。我们使用三重引号来定义单行或多行引号。基本上,这些用于描述函数或特定的程序。让我们理解以下示例。

示例

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
  • 在函数内部使用空行 – 有时候,我们需要编写一个复杂的函数,在返回语句之前包含了几个步骤。因此,我们可以在每个步骤之间添加空行。让我们看下面的示例。
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'

我们不应该使用等价操作符==来比较布尔值。它只能取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!'

第二个选择是评估 x is None 并基于其结果进行if语句。

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

两个选项都是正确的,但第一个选项更简单,因此PEP 8鼓励使用。

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程