1.优化字符串格式化,替换%s,使用str.format
#优化前写法
userIds = '1,2,3';
print('select * from user where id in (%s)'%(userIds))
#优化方案一
print('select * from user where id in %(userIds)s'% {'userIds':'1,2,3'})
#推荐方案
print('select * from user where id in ({userIds})'.format(userIds='1,2,3'))
2.使用with-as-var代替try-catch-finally
with 是上线文管理器,使用with-as-var的python代码会默认执行var变量class中的enter,exit两个函数
#优化前,常规写法
file = open('/data/log.txt')
data = file.read()
file.close()
#优化推荐方案
with open('/data/log.txt') as f:
data = f.read()
3.没有三元符,使用if-else代替;没有switch case 使用if-else代替
#三元符号代替
x=0
y=1
print(x if x<y else y)
#switch case代替
if n==0:
print('this is n',n)
elif n==1:
print('this is n',n)
else:
print('default')
4.函数编写4个原则
- 函数设计要短小,嵌套层次不能过深(不要超过3层)
- 函数声明命名合理,参数不能过多
- 函数参数设计应该向下兼容
- 保持一个函数只干一件事情
5.数据交换值不使用中间变量
#优化前
temp=x
x=y
y=temp
#优化推荐方案,cool!
#主要是数值计算遇到表达式python的计算顺叙导致
x,y=y,x
6.不使用type用来做类型判断
- 继承基础类(int ,string等)的class使用type判断会失败
- python 2.2之前引入的类使用type判断类型都是一样的,不准确
7.数值计算除法,先转成浮点类后做计算(python 3已修正)
8.慎用eval。‘eval is evil’,或者使用ast.literal_eval代替
- 当执行字符串是用户参数,eval函数会被用来执行用户提交的恶意代码
9.使用enumerate()获取序列迭代的索引和值(字典不适用)
li = ['a','b','c','d','e','f','g','h']
#常规用法
index = 0
while index<len(li):
print('index {index},element {value}'.format(index,value=li[index]))
index=index+1
#推荐写法
for i,e in enumerate(li):
print('index {index},element {value}'.format(i,e)
10. is和==不相符合
- is是判断两个变量是同一个对象,==是指对象的值相等
11. 异常完善处理组合try-except-else-finally流程图如下:
12. None判断空值是一个陷阱
- None既不是0,也不是False
- None是一个单例,所有赋值为None的对象都是同一个对象
#错误示例
if var is not None:
do empty
else:
do some thing
#正确写法
#自动调用内部__nonzero__来判断变量是否为空,如果一个对象没有__nonzero__,python将会获取__len__来判断
#如果一个类既没有__nonzero__,也没有__len__,那么if的判断都为True
if var :
do empty
else:
do some thing
13. 连接字符串使用join而不是+,效率高
#优化前写法
#总共申请和复制内存n-1次,共计n-1个中间结果
str1,str2,str3='test','string','connect'
print(str1+str2+str3)
#推荐写法
#处理前一次性计算申请内存总数,只做一次
print(''.join([str1,str2,str3]))
14. 使用Counter进行计数统计
#优化前
from collections import defaultdict
some_data = ['a','2',2,3,5,'2']
count = defaultdict(int)
for value in some_data:
count[value]+=1
#推荐优化
from collections import Counter
print(Counter(some_data))
15. 好用的配置管理库ConfigParser
16. 好用的命令行处理参数argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-o','--output')
args = parser.parse_args()
17. 使用pandas处理大型csv文件
import pandas as pd
df = pd.read_csv('./account.csv')
#获取文件前10行
print(df.head(n=10))
#获取文件后10行
print(df.tail(n=10))
#获取文件列
print(df.columns)
18. 一般情况下使用ElementTree解析XML
19. 使用traceback获取堆栈信息
20. 使用logging记录日志信息
- logging的名字建议按模块命名
- logging是线程安全,但不支持多线程写同一个日志文件,多线程任务需要配置不同日志文件
21.使用threading模块编写多线程
22.使用Queue模块编写安全多线程任务
23.init不是构造函数,new才是构造函数
24.使用Pylint检查代码风格
25.利用cProfile定位性能瓶颈
#方法一,foo()为需要定位的函数
if __name__=="__main__":
import cProfile
cProfile.run("foo()")
#方法二,python解释器调用cProfile,执行如下命令行
python -m cProfile test.py