在本教程中,我们将学习什么是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_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, ]  

示例 - 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的代码。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程