编写高质量python代码

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容