>백엔드 개발 >파이썬 튜토리얼 >Python 코딩 표준 지식 포인트 편집

Python 코딩 표준 지식 포인트 편집

WBOY
WBOY앞으로
2022-07-08 14:37:322540검색

이 글은 코딩 표준과 관련된 문제를 주로 정리한 Python에 대한 관련 지식을 제공합니다. Python 코드를 잘 작성하려면 Python 관련 코딩 표준을 이해해야 합니다. 이 축복을 받으면 코드를 작성할 수 있을 뿐만 아니라. 해당 기능이 구현되지만 간단하고 읽기 쉬우며 논리가 명확하여 모든 사람에게 도움이 되기를 바랍니다.

Python 코딩 표준 지식 포인트 편집

[관련 추천: Python3 동영상 튜토리얼 ]

파이썬 코드를 잘 작성하려면, 파이썬 관련 코딩 사양을 이해해야 합니다. 이를 통해 여러분이 작성하는 코드는 해당하는 것만 달성할 수 있는 것이 아닙니다. 기능은 간단하고 읽기 쉬우며 논리가 명확합니다. 스킬 트리의 이 섹션은 해당 Python 코딩 사양을 주로 공유합니다. Python을 배우는 친구라면 꼭 읽어보세요. Python 코드 작성 능력이 향상될 것입니다! ! !

1 코드 인코딩 형식

  • 일반적으로 스크립트에서는 인코딩 형식을 선언해야 합니다.
  • 국제 규칙, 파일 인코딩 및 Python 인코딩 형식은 모두 utf-8입니다. 예: Python 코드 시작 부분에 다음 코드를 균일하게 추가합니다.
# -- coding: utf-8 --
  • Python 소스 코드 파일이 인코딩 형식을 선언하지 않으면 Python 인터프리터는 기본적으로 ASCII 인코딩을 사용합니다. 그러나 ASCII가 아닌 문자가 나타나면 Python 인터프리터는 오류를 보고합니다. 따라서 ASCII가 아닌 문자가 포함된 문자열에 u 접두사를 추가하세요.
  • Python 코딩 문제가 있는 경우 다음과 같이 해결해 볼 수 있습니다.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

2 세미콜론

줄 끝에 세미콜론을 추가하지 말고 두 개의 명령을 입력하는 데 세미콜론을 사용하지 마세요. 같은 줄.

최대 길이는 3줄

한 줄당 80자 이하여야 합니다.

예외:

  1. 긴 가져오기 모듈 문
  2. 댓글의 URL

백슬래시를 사용하여 줄을 연결하지 마세요.

Python은 괄호, 대괄호 및 중괄호로 묶인 줄을 암시적으로 연결합니다.

괄호, 대괄호 또는 중괄호 안의 표현식은 백슬래시를 사용하지 않고도 여러 줄로 나눌 수 있습니다. 예:

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year

암시적 줄 접합은 주석 처리할 수 있습니다. 후속 라인의 들여쓰기는 프로그램 구조에 영향을 주지 않습니다. 후속 라인도 빈 라인이 될 수 있습니다.

필요한 경우 표현식 주위에 괄호를 추가할 수 있습니다.

텍스트 문자열이 한 줄에 맞지 않으면 괄호를 사용하여 암시적 줄 연결을 구현할 수 있습니다.

x = ('这是一个非常长非常长非常长非常长 '
     '非常长非常长非常长非常长非常长非常长的字符串')

4 들여쓰기 규칙

  • Python은 코드 들여쓰기와 콜론(:)을 사용하여 코드 블록 간의 수준을 구분합니다.
  • Python에서는 클래스 정의, 함수 정의, 흐름 제어 문, 예외 처리 문 등의 경우 줄 끝의 콜론과 다음 줄의 들여쓰기는 다음 코드 블록의 시작을 나타내고 끝을 나타냅니다. 들여쓰기는 이 코드의 블록 끝을 나타냅니다.
  • Python에서 코드를 들여쓰려면 공백이나 Tab 키를 사용할 수 있습니다. 그러나 공백을 수동으로 입력하든 Tab 키를 사용하든 일반적으로 들여쓰기 양으로 4개의 공백이 사용됩니다(기본적으로 Tab 키 하나는 4개의 공백을 나타냅니다).
  • Python 들여쓰기 규칙의 경우 초보자는 이렇게 이해할 수 있습니다. Python에서는 동일한 범위에 속하는 각 코드 줄의 들여쓰기 양이 동일해야 하지만 특정 들여쓰기 양에 대해 엄격하고 빠른 규칙은 없습니다.

Emacs의 Python 모드 기본값(들여쓰기 수준당 공백 4개)을 사용하는 것이 좋습니다. 탭을 사용하지 말고 탭과 공백을 혼합하지 마세요

올바른 샘플 코드:

if a==0:
    print("正确")        # 缩进4个空白占位
else:                    # 与if对齐
    print("错误")        # 缩进4个空白占位

或者

# 4 个空格缩进,第一行不需要
foo = long_function_name(
    var_one, var_two, var_three,
    var_four)

잘못된 샘플 코드:

if a==0:
    print("正确") 
else:              
    print("错误")   
 print("end")       # 错误的是这行代码前面加了一个空格

或者

# 2 个空格是禁止的
foo = long_function_name(
  var_one, var_two, var_three,
  var_four)

댓글 5개

  • Python의 댓글에는 #을 사용하세요. # 기호 다음에는 #이 와야 합니다. 한 칸은 비워두세요.
  • 코드에서 주석이 가장 많이 필요한 기술적인 부분은 다음과 같습니다. 복잡한 작업의 경우 작업이 시작되기 전에 여러 줄의 주석을 작성해야 하며, 한눈에 명확하지 않은 코드의 경우 주석을 끝에 추가해야 합니다. 선.
  • 가독성을 높이려면 주석과 코드 사이에 일정한 거리를 유지하세요. 주석은 코드에서 최소 2칸 이상 떨어져 있어야 합니다. 코드를 작성하기 전에 블록 주석 뒤에 몇 줄을 더 공백으로 두는 것이 가장 좋습니다.
  • 코드가 변경되면 해당 주석을 먼저 업데이트하세요.
  • 댓글이 구문이나 문장인 경우 소문자로 시작하는 식별자가 아닌 이상 첫 번째 단어를 대문자로 사용해야 합니다(식별자의 대소문자를 변경하지 마세요!).
  • 댓글이 짧을 경우 마지막 마침표는 생략 가능합니다. 블록 댓글은 일반적으로 하나 이상의 완전한 문장으로 구성된 단락으로 구성되며, 각 문장은 마침표로 끝납니다.
  • 문장 끝에는 공백 두 개를 사용해야 합니다.

Python에는 세 가지 형태의 주석이 있습니다: 라인 주석, 블록 주석, 문서 주석

라인 주석: 주석은 코드 자체가 아니라 자신이 수행하는 작업을 설명해야 합니다

  • 有节制地使用行内注释
  • 行内注释是与代码语句同行的注释
  • 行内注释和代码至少要有两个空格分隔
  • 注释由#和一个空格开始。
n = input()
m = input()
t = n / 2     # t是n的一半

# 循环,条件为t*m/n 小于n
while (t * m / (n + 1) < n):
    t = 0.5 * m + n / 2     # 重新计算t值
print(t)

块注释

  • 块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别
  • 块注释的每一行开头使用一个 # 和一个空格(除非块注释内部缩进文本)。
  • 块注释内部的段落通常只有一个 # 的空行分隔。
def FuncName(parameter1,parameter2):

"""

描述函数要做的事情

:param parameter1: 参数一描述(类型、用途等)

:param parameter2: 参数二描述

:return: 返回值描述

"""
# We use a weighted dictionary search to find out where i is in
# the array.  We extrapolate position based on the largest num
# in the array and the array size and then do binary search to
# get the exact number.

if i & (i-1) == 0:        # true if i is a power of 2

文档注释

  • 要为所有的公共模块,函数,类和方法编写文档说明
  • 非公共的方法没有必要,但是应该有一个描述方法具体作用的注释。这个注释应该在def那一行之后
  • 多行文档注释使用的结尾三引号应该是自成一行
class SampleClass(object):
    """Summary of class here.

    Longer class information....
    Longer class information....

    Attributes:
        likes_spam: A boolean indicating if we like SPAM or not.
        eggs: An integer count of the eggs we have laid.
    """

    def __init__(self, likes_spam=False):
        """Inits SampleClass with blah."""
        self.likes_spam = likes_spam
        self.eggs = 0

    def public_method(self):
        """Performs operation blah."""

6 空行

  • 顶层函数和类定义,前后用两个空行隔开
  • 编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行
  • 类里面方法定义用一个空行隔开
  • 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行
class Class01:
    pass
 
 
class Class02:
    def function_01(self):
        pass
 
    def function_02(self):
        pass

使用必要的空行可以增加代码的可读性,通常在顶级定义(如函数或类的定义)之间空两行,而方法定义之间空一行,另外在用于分隔某些功能的位置也可以空一行。

7 制表符还是空格

  • 不要混用制表符和空格,因为如果混用了,虽然在编辑环境中显示两条语句为同一缩进层次,但因为制表符和空格的不同会导致 Python 解释为两个不同的层次。
  • 在调用 Python 命令行解释器时使用 -t 选项,可对代码中不合法的混合制表符和空格发出警告,使用 -tt 时警告将变成错误,这些选项是被高度推荐的。但是强烈推荐仅使用空格而不是制表符。

空格使用规则:

  • 在二元运算符两边各空一格,比如赋值(=)、比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not),算术操作符两边的空格可灵活使用,但两侧务必要保持一致
  • 不要在逗号、分号、冒号前面加空格,但应该在它们后面加(除非在行尾)
  • 函数的参数列表中,逗号之后要有空格
  • 函数的参数列表中,默认值等号两边不要添加空格
  • 左括号之后,右括号之前不要加添加空格
  • 参数列表, 索引或切片的左括号前不应加空格
  • 当'='用于指示关键字参数或默认参数值时,不要在其两侧使用空格
  • 正确示例代码:

    spam(ham[1], {eggs: 2}, [])
    
    if x == 4:
        print x, y
    x, y = y, x
    
    dict['key'] = list[index]
    
    def complex(real, imag=0.0): return magic(r=real, i=imag)

    错误示例代码:

    spam( ham[ 1 ] , { eggs: 2 } , [ ] )
    
    if x == 4 :
        print x , y
    x , y = y , x
    
    dict ['key'] = list [index]
    
    def complex(real, imag = 0.0): return magic(r = real, i = imag)

    8 命名规范

    模块名命名

    • 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
    # 正确
    
    import decoder
    
    import html_parser
    
    # 不推荐
    
    import Decoder

    变量命名

    • 不要使用字母I (小写的L), O (大写的O), I (大写的I)作为单字符的变量名。在有些字体里面,这些字符无法与数字0和1区分。如果想用I, 可使用L代替。
    • 变量名尽量小写, 如有多个单词,用下划线隔开。
    count = 0
    this_is_var = 0

    常量或者全局变量命名

    • 全部大写,如有多个单词,用下划线隔开
    • 全⼤写+下划线式驼峰
    MAX_CLIENT = 100

    函数命名

    • 函数名应该小写,如有多个单词,用下划线隔开。
    • 大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用,保持向后兼容。
    • 私有函数在函数前加一个下划线_
    def run():
        pass
    
    def run_with_env():
        pass
    
    
    class Person():
        def _private_func():
            pass

    类命名

    • 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
    • 在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。
    • 对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量。
    class Farm():
        pass
    
    class AnimalFarm(Farm):
        pass
    
    class _PrivateFarm(Farm):
        pass

    类里面函数和方法参数

    • 始终要将self作为实例方法的第一个参数。
    • 始终要将cls作为类方法的第一个参数。
    • 如果函数的参数名和已有关键字冲突,在最后加大意下划线比缩写或者随意拼写更好。因此class_比clss更好。

    特别注意:

    • 不要中英文混编
    • 不要有a、b、c这种没有意义的命名
    • 不要怕名字长就随便缩写,比如person_info 缩写成pi
    • 不要用大小写区分变量类型,比如a是int类型,A是String类型
    • 不要使用容易引起混淆的变量名
    • bool变量⼀般加上前缀 is_ 如:is_success
    • 变量名不要用系统关键字,如 dir type str等等

    以下用下画线作前导或结尾的特殊形式是被公认的:

    • _single_leading_underscore(以一个下画线作前导):例如,“from M import *”不会导入以下画线开头的对象。
    • single_trailing_underscore_(以一个下画线结尾):用于避免与 Python 关键词的冲突,例如“Tkinter.Toplevel(master, class_='ClassName')”。
    • __double_leading_underscore (双下画线):从 Python 1.4 起为类私有名。
    • __double_leading_and_trailing_underscore__:特殊的(magic) 对象或属性,存在于
      用户控制的(user-controlled)名字空间,例如:__init__、__import__ 或 __file__。

    9 引号用法规则

    • 自然语言使用双引号
    • 机器标识使用单引号
    • 正则表达式使用双引号
    • 文档字符串 (docstring) 使用三个双引号

    字符串引号规则:

    • 单引号和双引号字符串是相同的。当一个字符串中包含单引号或者双引号字符串的时候,使用和最外层不同的符号来避免使用反斜杠,从而提高可读性。
    • 在同一个文件中,保持使用字符串引号的一致性。在字符串内可以使用另外一种引号,以避免在字符串中使用。

    正确使用示例:

    Tim('Why are you hiding your eyes?')
    Bob("I'm scared of lint errors.")
    Juy('"Good!" thought a happy Python reviewer.')
    • 当且仅当代码中使用单引号'来引用字符串时,才可能会使用三重'''为非文档字符串的多行字符串来标识引用
    • 文档字符串必须使用三重双引号"""

    10 模块导入规则

    • 导入应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。
    • 导入应该按照从最通用到最不通用的顺序分组:标准库导入、第三方库导入、应用程序指定导入,分组之间空一行。
    •  模块名称要短,使用小写,并避免使用特殊符号, 比如点和问号。
    • 尽量保持模块名简单,以无需分开单词最佳(不推荐在两个单词之间使用下划线)。
    • 每个导入应该独占一行。

    正确使用例子:

    import os
    import numpy
    import sys
    
    from types import StringType, ListType

    错误使用例子:

    import os, numpy, sys
    • 从一个包含类的模块中导入类时,通常可以写成这样:
    from MyClass import MyClass 
    from foo.bar.YourClass import YourClass

    模块导入建议

    示例 评价
    from modu import * 差, 不清楚具体从模块中导入了哪些内容
    from modu import sqrt 稍好

    import modu

    import modu.sqrt

    最佳 , 调用的时候直接使用modu.sqrt能比较清楚的知道当前方法属于哪个模块

    import os

    import sys

    推荐

    import os, sys

    不推荐
    from subprocess import Popen, PIPE 推荐

    11 Main

    主功能应该放在一个main()函数中。

    在Python中,pydoc以及单元测试要求模块必须是可导入的。代码应该在执行主程序前总是检查 if __name__ == '__main__', 这样当模块被导入时主程序就不会被执行。

    def main():
          ...
    
    if __name__ == '__main__':
        main()

    12 函数设计规范

    • 函数设计的主要目标就是最大化代码重用和最小化代码冗余。精心设计的函数不仅可以提高程序的健壮性,还可以增强可读性、减少维护成本。
    • 函数设计要尽量短小,嵌套层次不宜过深。 所谓短小, 就是尽量避免过长函数, 因为这样不需要上下拉动滚动条就能获得整体感观, 而不是来回翻动屏幕去寻找某个变量或者某条逻辑判断等。 函数中需要用到 if、 elif、 while 、 for 等循环语句的地方,尽量不要嵌套过深,最好能控制在3层以内。不然有时候为了弄清楚哪段代码属于内部嵌套, 哪段属于中间层次的嵌套, 哪段属于更外一层的嵌套所花费的时间比读代码细节所用时间更多。
    • 尽可能通过参数接受输入,以及通过return产生输出以保证函数的独立性。
    • 尽量减少使用全局变量进行函数间通信。
    • 不要在函数中直接修改可变类型的参数。
    • 函数申明应该做到合理、 简单、 易于使用。 除了函数名能够正确反映其大体功能外, 参数的设计也应该简洁明了, 参数个数不宜太多。 参数太多带来的弊端是: 调用者需要花费更多的时间去理解每个参数的意思,测试的时候测试用例编写的难度也会加大。
    • 函数参数设计应该考虑向下兼容。

    13 版本注记

    如果要将 RCS 或 CVS 的杂项包含在你的源文件中,按如下格式操作:

    __version__ = "$Revision: 1.4 $" 
    # $Source: E:/cvsroot/python_doc/pep8.txt,v $

    对于 CVS 的服务器工作标记更应该在代码段中明确出它的使用说明,如在文档最开始的版权声明后应加入如下版本标记:

    # 文件:$id$ 
    # 版本:$Revision$

    这样的标记在提交给配置管理服务器后,会自动适配成为相应的字符串,如:

    # 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $ 
    # 版本:$Revision: 1.4 $

    这些应该包含在模块的文档字符串之后,所有代码之前,上下用一个空行分割。

    【相关推荐:Python3视频教程

    위 내용은 Python 코딩 표준 지식 포인트 편집의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제