python编码规范

1.换行
每行不超过80个字符
圆括号,中括号,花括号会将行隐式连接,反斜杠也会进行隐式连接
反斜杠可以控制换行

#python代码规范
def foo(argv1,argv2,
            argv3):
    print '%s,%s,%s'%(argv1,argv2,argv3)
    args=['a','b',
            'c']
    print args
    dictobj={'name':'python',
                'score':'8.5'}
    print dictobj
foo(1,2,3)

运行结果:

#python代码规范
obj="""sdfsdfsdfsdf
23424324234"""
print obj
obj2=('sdfsdfsdfsdf'
'23424324234')
print obj2
obj3=1+\
     2
print obj3

运行结果:

三个双引号,表示引号内的为一个字符串,
括号表示可以将两个字符串隐式连接成一个。

2.不要在返回语句,条件语句中使用括号

# #python代码规范
def func(foo):
    if foo:
        return 'yes'
    if not foo:
        return('no')
print func(False)

3.缩进
不要使用tab缩进,使用空格
4.空格
1)#注释符后面加一个空格
2)list,dict,tuple,set中,:后面加空格
3)+-*/两端加空格
4)参数列表中的=,括号不需要加空格

# 列表
list1 = [1, 2, 3]
# 字典
dict1 = {'a': '1', 'b': '2','c': '3'}
# 元组不可更改,元素可重复
tup1 = ('a', 'a')
# 集合元素不可重复
set1 = ('a', 'b')
# 操作符两端加空格
val1 = val2 + val3
# 参数列表中的=两端不需要空格,括号两端不需要空格
def func1(a=1, b=2):
    return a+b

5.命名
Class类,使用紧凑双驼峰法,如MyClass
其余使用小写, 中间用下划线_连接,如:my_func,my_variable
6.导入import
1)import放在文件开头,导入顺序为
标准库
第三方库
本项目的package,module
2)不要使用from foo import *,使用from foo import func1,var1
3)不要使用隐式的相对导入,最好使用全路径导入

import sys
import os

from tornado.web import RequestHandler

from mymessage import var1,var2

7.异常
1)只在可能异常的地方使用try/except
8.字符串
1)使用join拼接字符串
2)使用str类型方法,而不是string模块的方法
3)使用startswith和endswith比较前缀和后缀
4)使用format方法格式化字符串
9.比较
1)空的list,str,tuple,set,dict和0,0.0,None都是False
2)使用if some_list而不是if len(some_list)判断某个list是否为空
3)使用is,is not和单例(如None)进行比较,而不是==或!=
4)使用if a is not None而不是if not a is None
5)不要用==或!=和True或False比较
6)使用in操作,如key in dict而不是dict.has_key()
7)list的查找是线性的,复杂度为o(n),set底层是hashtable,复杂度为o(1),但比list占用更多内存空间
8)使用列表表达式,字典表达式,生成器

l=["egg%s"%i for i in range (100) if i >90 and i<95]
print(l)
dict1={'a': '1', 'b': '2'}
l=[item for item in dict1]
print l
g = (x * x for x in range(10))
print g

运行结果:

9.dict的get方法可以指定默认值,[]可以抛出Keyerror

dict.get(key, default=None)

10.使用for item in list迭代list,for index,item in enumerate(list)迭代下标和lis

l=['a','b','c']
for item in l:
    print item
for index,item in enumerate(l):
    print index,item

运行结果:

11.使用内建函数sorted和List.sort()进行排序

aList = [123, 'xyz', 'zara', 'abc', 'xyz']
print sorted(aList)
aList.sort()
print aList

运行结果:

List.sort()在原列表上进行排序
sorted()产生一个新的列表
12.使用lambda表达式

g=lambda x:x+1
print g(1)

运行结果:

lambda表达式相当于定义了一个匿名函数,参数为x,函数体为return x+1,如

def g(x):
    return x+1

13.使用defaultdict ,Counter等冷门但好用的数据结构
14.使用装饰器
装饰器一般提供和函数本身功能无关的功能,如插入日志等。
不带参数装饰器:

import datetime
def mylog(func):
    def wrapper(*args, **kw):
        print "log %s"%datetime.datetime.now().strftime('%Y-%m-%d')
        return func(*args, **kw)
    return wrapper
@mylog
def add(a,b):
    print a+b
add(1,2)

运行结果:

带参数装饰器:

import datetime
def mylog(name):
    def decorator(func):
        def wrapper(*args, **kw):
            print "%s log %s"%(name,datetime.datetime.now().strftime('%Y-%m-%d'))
            return func(*args, **kw)
        return wrapper
    return decorator
@mylog('process1')
def add(a,b):
    print a+b
add(1,2)

运行结果:

15.使用with处理上下文
16.有时候对类型不要做太过严格的限制,适当利用Python的鸭子类型(Duck Type)
17.使用logging记录日志,配置好格式和级别

posted on 2017-07-27 21:44  迪米特  阅读(219)  评论(0编辑  收藏  举报

导航