Python 代码风格指南—简化版

camera-classic-coffee-407294.jpg

通常代码不单单是写给自己看的。

当代码出现bug而你又想不通哪有问题时,就需要把代码贴到论坛或请身边的人审阅。

或者你在公司上班,代码需要交给上级审阅。

或者是你完成了某个项目,然后分享了你的结果,共享了你的代码。

又或者你在Github上发起了一个开源项目。

这些都需要别人阅读你的代码,如果你的代码格式混乱,别人就会失去耐心。这也就加大了你们之间的沟通成本。

所以有必要了解一些基础的代码风格或习惯。

作为官方的Python 代码风格指南,必然要写的详细,因为需要考虑所有的情形。但对于编程新手而言,阅读完整份文档确实有些划不来,因为不需要面对这么多情况。所以我总结了一份缩简版,记录了最基础的代码风格。

虽然是这里说得是Python 代码风格,但实际上绝大多数内容同样适用于其它编程软件。

作为编程新手,最需掌握的是四项内容:命名,空格/空行,缩进, 注释。

一、命名


  1. 变量名不要过于简单,尽量用能表达其含义的英文字母来表达。
Yes: num_student = len(student) 
No: n = len(student)
  1. 不要使用小写l(对应大写L)、大写O和大写I(对应小写i),因为它们很容易混淆
  2. 类名需要首字母大写
  3. 函数名小写字母,并且各字母之间用_分隔
  4. 常量用大写字母

二、空格/空行


通常赋值符或运算符两边需要加上空格,x = a + b 要比 x=a+b 更加整洁。

不使用空格的情况

  1. 行末尾
    行末尾的空格既没有价值,又可能会造在bug。

  2. 逗号与括号之间

Yes: foo = (0,)
No:  bar = (0, )
  1. 紧跟着变量
Yes: if x == 4: print x, y; x, y = y, x
No:  if x == 4 : print x , y ; x , y = y , x
  1. 与冒号有关时
Yes:
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]

No:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]

其它提醒

  1. 如果一个表达示中有多级运算,可以在优先级低的运算符周边使用空格,但最多使用一个空格:
Yes:
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

No:
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
  1. 对于函数参数中的赋值符,不需要使用空格:
Yes:

def complex(real, imag=0.0):
    return magic(r=real, i=imag)
No:

def complex(real, imag = 0.0):
    return magic(r = real, i = imag)
  1. 二元运算符应该在第二个值之前
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
  1. 空行
    函数与函数之间需要二个空行分隔。
    函数之间的逻辑块用空行来分隔,这样可以更清楚地看清哪部分是相互关联的。

三、缩进


space VS tab

空格与制表符就是一对冤家,美剧《硅谷》中也特地用了几个场景来描述它们对现实生活产生的麻烦。

指南中建议使用空格,而且每一级缩进用四个空格。但我还是习惯用制表符,因为按一下总比按四下快。当然,制表符在不同的环境下可能会表示不同数量的空格,所以复制别人的代码时可能会造成格式不一致。我想这也是指南中建议用空格的原因。

缩进的数量

  1. 延长部份需要对齐,比如
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
  1. 为了方便阅读,分隔不同意义的语句,使用不同的层级,比如:
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

而不是:

def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

四、注释


注释是为了让人更快的理解函数,如果你的注释会造成误解,还不如不写注释。所以当你为一个函数写了注释,并且更改了函数代码时,必需要及时更新你的注释。

注释尽量用英文。

注释总是要以#和空格开始。

注释块:

注释块是对接下来的逻辑代码块进行注释。

注释块需要与解释的代码对齐,并且注释块中的段落用空行分隔。

注释行

在 stetement 后的注释称为注释行或行注释。

注释行与前面的 statement 至少空两格。

文档注释:

文档注释是对函数的说明,需要在 def 下一行就给出。使用三个引号,并且最后的引号要单独一行,比如:

"""Return a foobang

Optional plotz says to frobnicate the bizbaz first.
"""

五、其它


行长

行长控制在79字符之内。

import

在文件开头就引入所有需要的库,并且每行只引入一个库。引入顺序为:

  1. 标准库
  2. 第三方库
  3. 自己写的类/库

这三为类引入之间还需要空行分隔。

编程建议

  1. 如果需要表达if x is not None 就用if x即可。

  2. 用到try except 语句时

Yes:
try:
    value = collection[key]
except KeyError:
    return key_not_found(key)
else:
    return handle_value(value)

No:
try:
    # Too broad!
    return handle_value(collection[key])
except KeyError:
    # Will also catch KeyError raised by handle_value()
    return key_not_found(key)
  1. return
    函数中的return statement 要保持一致,不要为了简便而省略return None
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 更新时间:2016/5/13 介绍 本文档所提供的编码规范,适用于主要的Python发行版中组成标准库的Pytho...
    超net阅读 5,845评论 0 15
  • 一个统一的编程风格不但能够增强代码可读性,也可以避免许多低级问题。一个严格遵从编码规范的团队,代码无论出自多少人之...
    七弦桐语阅读 616评论 0 2
  • Python是一种对代码风格很重视的语言,从缩进就能看出这一点,Python强调易于理解。最近在负责代码重构的工作...
    知曰阅读 10,773评论 1 85
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 3,370评论 2 36
  • 粉丝原本是追星族的代名词,这些人可以不辞辛劳,驱车百里甚至是千里去参加某个明星的演唱会,会花大量的资金去购买他们已...
    残剑阅读 431评论 0 1