代码除了用来运行外,更多的是用来读。为了是代码的可读性更强,不少编程语言都有本身的编码规范。规范的制定是为了保持代码的一致性,以使代码更美观和易读。代码应该怎么样排版和编写并非绝对的,因此一些地方会有争议。有时风格指南并不适用,最重要的知道什么时候不一致。当你没法判断该怎么作时,应该所参考下其余的例子。html
本文仅是一个 Python 编码风格的参考,并非一个规定,规定必需要这么去作。本文的目的应该是起一个指导做用,指导开发者去写更易读的代码。python
主要是缩进与空行的排版:程序员
主要是整个源码文件的布局:算法
import os, sys
不推荐。from xx import xx
,尽可能避免使用 from xx imoprt *
。from xx import *
时,应该在导入语句后或者模块尾使用 __all__
机制来限制导入规则。if foo: bar(foo)
.class UnfoundError(Exception): pass
.# 一行写不下时,有括号来链接多行,后续行应该使用悬挂缩进 if (this_is_one_thing and that_is_another_thing): do_something() # 函数调用参数较多时,对准左括号 f = foo(a, b, c, d) # 不对准左括号,但加多一层缩进,以和后面内容区别 def long_function_name( a, b, c, d, e): print(a, b, c, d, e) # 列表、元组、字典以及函数调用时可让右括号回退,这样更加美观 l = [ 1, 2, 3, 4, 5, 6, ] result = some_function( 'a', 'b', 'c', 'd', 'e', 'f', )
整体原则,避免没必要要的空格。编程
良好的风格:session
spam(ham[1], {eggs: 2}) if x == 4: print x, y; x, y = y, x f = foo(1, 2, 3) ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] x = 1 y = 2 long_variable = 3 def foo(a, b, c=0): return moo(m=a, n=b, o=c)
很差的风格:数据结构
spam( ham[ 1 ], { eggs: 2 } ) if x == 4 : print x , y ; x , y = y , x f = foo (1, 2, 3) ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper] x = 1 y = 2 long_variable = 3 def foo(a, b, c = 0): return moo(m = a, n = b, o = c)
整体原则,错误的注释不如没有注释。因此当一段代码发生变化时,第一件事就是要修改注释。注释尽可能使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。若是是短语,能够省略结束符。注释应该在 #
后加一个空格才开始写注释内容。编程语言
# Description : Module config. # # Input : None # # Output : None
person = { "name": "huoty", # 姓名 "age": 26, # 年龄 "stature": 169, # 身高 "weight": 60, # 体重 } print person # 输出信息
TODO
注释来标记待完成的工做,团队协做中,必要的时候应该写上你的名字或者联系方式,好比:# TODO(sudohuoty@gmail.com): Use a "*" here for string repetition. # TODO(Huoty) Change this to use relations.
# 你可能会认为你读得懂如下的代码。可是你不会懂的,相信我吧。 # 要是你尝试玩弄这段代码的话,你将会在无尽的通宵中不断地咒骂本身为何会认为本身聪明到能够优化这段代码。 # so,如今请关闭这个文件去玩点别的吧。 # 程序员1(于2010年6月7日):在这个坑临时加入一些调料 # 程序员2(于2011年5月22日):临你个屁啊 # 程序员3(于2012年7月23日):楼上都是狗屎,鉴定完毕 # 程序员4(于2013年8月2日):fuck 楼上,三年了,这坑还在!!! # 程序员5(于2014年8月21日):哈哈哈,这坑竟然坑了这么多人,幸亏我也不用填了,系统终止运行了,you're died
docstring
。"""Convert an API path to a filesystem path If given, root will be prepended to the path. root must be a filesystem path already. """
"""函数或方法的概述 详细的描述信息…… 详细的描述信息…… 参数说明 -------- 参数1:... 参数2:... 返回值: ... 异常: 异常1:... 异常2:... """
一个参考示例:编辑器
"""Start a kernel for a session and return its kernel_id. Parameters ---------- kernel_id : uuid The uuid to associate the new kernel with. If this is not None, this kernel will be persistent whenever it is requested. path : API path The API path (unicode, '/' delimited) for the cwd. Will be transformed to an OS path relative to root_dir. kernel_name : str The name identifying which kernel spec to launch. This is ignored if an existing kernel is returned, but it may be checked in the future. Return a kernel id """
"""这里是类的概述。 详细的描述信息…… 详细的描述信息…… 属性(Attributes): ----------------- 属性1: ... 属性2: ... """
Error
后缀的方式,好比:HTTPError。_foo
, _show_msg
来进行访问控制。__a
, 则不能用 Foo.__a
的方式访问,但能够用 Foo._Foo__a
的方式访问。`Python 属于脚本语言,代码的运行是经过解释器对代码文件进行逐行解释执行来完成的。它不像其余编程语言那样有统一的入口程序,好比 Java 有 Main 方法,C/C++ 有 main 方法。Python 的代码文件除了能够被直接执行外,还能够做为模块被其余文件导入。全部的顶级代码在模块导入时都会被执行,当但愿模块被导入时,应该避免主程序被执行。这样就须要把主程序放到 if __name__ == '__main__'
代码块中,好比:ide
def main(): ... if __name__ == '__main__': main()
一个包除了可以被导入外,也能够经过 python -m package
的方式被直接执行,前提是包中须要有 __main__.py
,这个文件能够说是包的程序入口,包中有了这个文件就能够用 Python 的 -m
参数来直接运行。
Note: 等于比较运算符(==) 会调用左操做数的 __eq__
函数,这个函数能够被其任意定义,而 is 操做只是作 id 比较,并不会被自定义。同时也能够发现 is 函数是要快于等于运算符的,由于不用查找和运行函数。
# Yes: if isinstance(obj, int) # No: if type(obj) is type(1)
# Yes: if not seq if seq # No: if len(seq) if not len(seq)
while 1
比 while True
更快。**
比 pow
快 10 倍以上。