分号
不要在行尾加分号, 也不要用分号将两条命令放在同一行.
行长度
每行不超过80个字符,例外: 1. 长的导入模块语句 2. 注释里的URL
不要使用反斜杠连接行.
Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.
如果一个文本字符串在一行放不下, 可以使用圆括号来实现隐式行连接:
在注释中,如果必要,将长的URL放在一行上.
|
|
括号
宁缺毋滥的使用括号
除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.
|
|
缩进
用4个空格来缩进代码
绝对不要用tab, 也不要tab和空格混用. 对于行连接的情况, 你应该要么垂直对齐换行的元素, 或者使用4空格的悬挂式缩进(这时第一行不应该有参数):
|
|
空行
顶级定义之间空两行, 方法定义之间空一行
顶级定义之间空两行, 比如函数或者类定义. 方法定义, 类定义与第一个方法之间, 都应该空一行. 函数或方法中, 某些地方要是你觉得合适, 就空一行.
空格
按照标准的排版规范来使用标点两边的空格
括号内不要有空格.
|
|
不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).
|
|
参数列表, 索引或切片的左括号前不应加空格.
|
|
|
|
|
|
在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not). 至于算术操作符两边的空格该如何使用, 需要你自己好好判断. 不过两侧务必要保持一致.
|
|
当=
用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.
|
|
不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):
|
|
Shebang
在计算机科学中, Shebang (也称为Hashbang)是一个由井号和叹号构成的字符串行(#!), 其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下, 类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令, 并将载有Shebang的文件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序.
- 文件头部要声明编码类型,默认使用utf81# -*- coding:utf-8 -*-
可以使用以上的兼容写法,也可以直接 # coding: utf-8
, 见 Defining Python Source Code Encodings
对于需要执行的 Python 文件,头部可以声明所使用的 Python 解释器的路径,放在编码类型声明之后
推荐使用 env 的声明方式,这样可以根据运行环境选择当前的 Python:1#!/usr/bin/env python如果要使用特定的执行路径的话,也可以直接写:
1#!/usr/bin/python
大部分.py文件不必以
#!
作为文件的开始.#!
先用于帮助内核找到Python解释器, 但是在导入模块时, 将会被忽略. 因此只有被直接执行的文件中才有必要加入#!
.
Main
即使是一个打算被用作脚本的文件, 也应该是可导入的. 并且简单的导入不应该导致这个脚本的主功能(main functionality)被执行, 这是一种副作用. 主功能应该放在一个main()函数中.
在Python中, pydoc以及单元测试要求模块必须是可导入的. 你的代码应该在执行主程序前总是检查 if __name__ == '__main__'
, 这样当模块被导入时主程序就不会被执行.
|
|
所有的顶级代码在模块导入时都会被执行. 要小心不要去调用函数, 创建对象, 或者执行那些不应该在使用pydoc时执行的操作.
编码建议
- 空的
str
,list
,tuple
,set
,dict
和0
,0.0
,None
都是False
. 判断list
是否为空时,用if not somelist
而不是if len(somelist) == 0
.判断list
是否非空,则用if somelist
而不是if len(somelist) > 0
,其他类型同理. - 只是判断是否是
None
,则用is
和is not
进行判断.使用if a is not None
而不是if not a is None
. - 使用
for item in list:
迭代list
,使用for index, item in enumerate(list):
迭代list
并获取数字索引.默认索引初值是0,可指定索引初始值,如:for index, item in enumerate(list, 1):
,则索引从1开始计数. - 使用
in
和not in
操作判断,str
是否有某子串,list
,tuple
,set
是否有某元素,dict
是否有某个键.