Python程序设计【语言规范】
【课程性质:大数据分析】
1. 实验目标
2. 适用的对象
Python基础
学习对象:本科学生、研究生、人工智能、算法相关研究者、开发者
大数据分析
实践学习部分
1. 语句
通常每个语句应该独占一行
不过, 如果测试结果与测试语句在一行放得下, 你也可以将它们放在同一行.
如果是if语句, 只有在没有else时才能这样做.
# Yes:
if foo: bar(foo)
# NO:
if foo: bar(foo)
else: baz(foo)
2. 冒号与缩进
Python中使用缩进来区分代码的逻辑性。
冒号:表示一段代码的开始。
使用 4 个空格进行缩进,尽量不要用Tab,更不能混合使用Tap和空格
我是曾经的 Tab 党,转为空格党的理由只有一个,就是 Tab 无法做到行内行末代码或注释的对齐。很多用tab的代码,在网页上查看对齐就乱了
而空格啥都可以。任何人用任何编辑器查看代码都是对齐的,包括网页上查看。
if 2 > 1:
print(2)
else:
print(1)
def func():
print("海豚大数据及人工智能实验室")
print("海豚大数据及人工智能实验室")
print("海豚大数据及人工智能实验室")
3. 分号
不要在行尾加分号, 也不要用分号将两条命令放在同一行。
a=1
b=2
c=3
变量定义不需要指定类型(动态语言)
禁止复合语句,即一行中包含多个语句:
# yes
do_first()
d _second()
do_third()
# no
do_first();do_second();do_third();
if/for/while一定要换行:
# yes
if foo == 'blah':
do_blah_thing()
# no
if foo == 'blah': do_blash_thing()
a=4;b=5;c=6
4. 括号
宁缺毋滥的使用括号
除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号.
# Yes:
if foo:
bar()
while x:
x = bar()
x += 1
if x and y:
bar()
if not x:
bar()
return foo
#No:
if (x):
bar()
if not(x):
bar()
return (foo)
x = [1, 2, 3]
y = (1, 2, 3)
z = {“a”:1, “b”:2, “c”:3}
5. 行宽与续行符
每行代码尽量不超过 80 个字符
理由:
这在查看 side-by-side 的 diff 时很有帮助
方便在控制台下查看代码
太长可能是设计有缺陷
反斜杠\
a = 1+2+3+4+5+ \
6+7+8+9+10
6. 换行
Python 支持括号内的换行。这时有两种情况。
第二行缩进到括号的起始处
foo = long_function_name(var_one, var_two,
var_three, var_four)
第二行缩进 4 个空格,适用于起始括号就换行的情形
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
使用反斜杠\换行,二元运算符+ .等应出现在行末;长字符串也可以用此法换行
session.query(MyTable).\
filter_by(id=1).\
one()
print ('Hello, '\
'%s %s!' %\
('Harry', 'Potter'))
7. 引号
Python支持 单引号、双引号、三单引号、三双引号
简单说,自然语言使用双引号,机器标示使用单引号,因此 代码里 多数应该使用 单引号
自然语言 使用双引号 "..." 例如错误信息;"输入类型错误"
机器标识 使用单引号 '...' 例如 dict 里的 key
正则表达式 使用原生的双引号 r"..."
文档字符 使用三个双引号 """......"""
(单引号、双引号)与(三单引号、三双引号)的用法比较 :
1). (单引号、双引号)表示多行时需要添加换行符\n。
2). (三单引号、三双引号)表示多行时无需使用任何多余字符
3). (三单引号、三双引号)中可直接使用(单引号、双引号)而无需使用反斜杠\进行转义
x = 'a'
y = "b"
z = """
123
456
"""
z
8. 空格
在二元运算符两边各空一格
[=,-,+=,==,>,in,is not, and]:
# yes
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
# no
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
函数的参数列表中,逗号之后要有空格
# yes
def complex(real, imag):
pass
# no
def complex(real,imag):
pass
函数的参数列表中,默认值等号两边不要添加空格
# yes
def complex(real, imag=0.0):
pass
# no
def complex(real, imag = 0.0):
pass
左括号之后,右括号之前不要加多余的空格
# yes
spam(ham[1], {eggs: 2})
# no
spam( ham[1], { eggs : 2 } )
字典对象的左括号之前不要多余的空格
# yes
dict['key'] = list[index]
# no
dict ['key'] = list [index]
不要为对齐赋值语句而使用的额外空格
# yes
x = 1
y = 2
long_variable = 3
# no
x = 1
y = 2
long_variable = 3
9. 注释
块注释
"#" 号后空一格,段落间用空行分开(同样需要“#”号)
# 块注释
# 块注释
#
# 块注释
# 块注释
行注释
至少使用两个空格和语句分开,使用有意义的注释
# yes
x = x + 1 # 边框加粗一个像素
# no
x = x + 1 # x 加 1
docstring
docstring 最其本的两点:
所有的公共模块、函数、类、方法,都应该写 docstring。
私有方法不一定需要,但应该在 def 后提供一个块注释来说明。
docstring 的结束"""应该独占一行,除非此 docstring 只有一行。
"""
Return a foobar
Optional plotz says to frobnicate the bizbaz first.
"""
"""Oneline docstring"""
10. 命名规范
应避免使用小写字母 l(L),大写字母 O(o) 或 I(i) 单独作为一个变量的名称,以区分数字 1 和 0
包和模块使用全小写命名,尽量不要使用下划线
类名使用 CamelCase 命名风格,内部类可用一个下划线开头
函数使用下划线分隔的小写命名
当参数名称和 Python 保留字冲突,可在最后添加一个下划线,而不是使用缩写或自造的词
常量使用以下划线分隔的大写命名
''单下划线开头:弱“内部使用”标识,如:”from M import *”,将不导入所有以下划线开头的对象,包括包、模块、成员 , 单下划线结尾:只是为了避免与 python 关键字的命名冲突
'__'双下划线开头:模块内的成员,表示私有成员,外部无法直接调用
MAX_OVERFLOW = 100
Class FooBar:
def foo_bar(self, print_):
print(print_)
应该避免的名称
单字符名称, 除了计数器和迭代器.
包/模块名中的连字符(-)
双下划线开头并结尾的名称(Python保留, 例如init)
Python之父Guido推荐的规范
11. import 语句
import 语句应该分行书写
#yes
import os
import sys
# no
import sys,os
# yes
from subprocess import Popen, PIPE
import 语句应该使用 absolute import
# yes
from foo.bar import Bar
# no
from ..bar import Bar
import 语句应该放在文件头部,置于模块说明及 docstring 之后,于全局变量之前;
import 语句应该按照顺序排列,每组之间用空行分隔
import os
import sys
import msgpack
import zmq
import foo
导入其他模块的类定义时,可以使用相对导入
from myclass import MyClass
如果发生命名冲突,则可使用命名空间
import bar
import foo.bar
bar.Bar()
foo.bar.Bar()