本文主要向大家介绍了Python语言 最差实践,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。最近在看一些陈年老系统,其中有一些不好的代码习惯遗留下来的坑;加上最近自己也写了一段烂代码导致服务器负载飙升,所以就趁此机会总结下我看到过/写过的自认为不好的Python代码习惯,时刻提醒自己远离这些“最差实践”,避免挖坑。下面所举的例子中,有一部分会造成性能问题,有一部分会导致隐藏bug,或日后维护、重构困难,还有一部分纯粹是我认为不够pythonic。所以大家自行甄别,取精去糟吧。函数默认参数使用可变对象这个例子我想大家应该在各种技术文章中见过许多遍了,也足以证明这是一个大坑。先看错误示范吧:def use_mutable_default_param(idx=0, ids=[]):

ids.append(idx)

print(idx)

print(ids)

use_mutable_default_param(idx=1)

use_mutable_default_param(idx=2)输出:1[1]2[1, 2]理解这其中的原因,最重要的是有两点:函数本身也是一个对象,默认参数绑定于这个函数对象上append这类方法会直接修改对象,所以下次调用此函数时,其绑定的默认参数已经不再是空list了正确的做法如下:def donot_use_mutable_default_param(idx=0, ids=None):

if ids is None:

ids = []

ids.append(idx)

print(idx)

print(ids)try…except不具体指明异常类型虽然在Python中使用try…except不会带来严重的性能问题,但是不加区分,直接捕获所有类型异常的做法,往往会掩盖掉其他的bug,造成难以追查的bug。一般的,我觉得应该尽量少的使用try…except,这样可以在开发期尽早的发现问题。即使要使用try…except,也应该尽可能的指定出要捕获的具体异常,并在except语句中将异常信息记入log,或者处理完之后,再直接raise出来。关于dict的冗余代码我经常能够看到这样的代码:d = {}

datas = [1, 2, 3, 4, 2, 3, 4, 1, 5]for k in datas: if k not in d:

d[k] = 0

d[k] += 1其实,完全可以使用collections.defaultdict这一数据结构更简单优雅的实现这样的功能:default_d = defaultdict(lambda: 0)

datas = [1, 2, 3, 4, 2, 3, 4, 1, 5]for k in datas:

default_d[k] += 1同样的,这样的代码:# d is a dictif 'list' not in d:

d['list'] = []

d['list'].append(x)完全可以用这样一行代码替代:# d is a dictd.setdefault('list', []).append(x)同样的,下面这两种写法一看就是带有浓浓的C味儿:# d is a dictfor k in d:

v = d[k] # do something# l is a listfor i in len(l):

v = l[i] # do something应该用更pythonic的写法:# d is a dictfor k, v in d.iteritems(): # do something

pass# l is a listfor i, v in enumerate(l): # do something

pass另外,enumerate其实还有个第二参数,表示序号从几开始。如果想要序号从1开始数起,可以使用enumerate(l, 1)。使用flag变量而不使用for…else语句同样,这样的代码也很常见:search_list = ['Jone', 'Aric', 'Luise', 'Frank', 'Wey']

found = Falsefor s in search_list: if s.startswith('C'):

found = True

# do something when found

print('Found') breakif not found: # do something when not found

print('Not found')其实,用for…else更优雅:search_list = ['Jone', 'Aric', 'Luise', 'Frank', 'Wey']for s in search_list: if s.startswith('C'): # do something when found

print('Found') breakelse: # do something when not found

print('Not found')过度使用tuple unpacking在Python中,允许对tuple类型进行unpack操作,如下所示:# human = ('James', 180, 32)name,height,age = human这个特性用起来很爽,比写name=human[0]之类的不知道高到哪里去了。所以,这一特性往往被滥用,一个human在程序的各处通过上面的方式unpack。然而如果后来需要在human中插入一个表示性别的数据sex,那么对于所有的这种unpack都需要进行修改,即使在有些逻辑中并不会使用到性别。# human = ('James', 180, 32)name,height,age, _ = human# or# name, height, age, sex = human有如下几种方式解决这一问题:老老实实写name=human[0]这种代码,在需要使用性别信息处加上sex=human[3]使用dict来表示human使用namedtuple# human = namedtuple('human', ['name', 'height', 'age', 'sex'])h = human('James', 180, 32, 0)# then you can use h.name, h.sex and so on everywhere.到处都是import *import *是一种懒惰的行为,它不仅会污染当前的命名空间,并且还会使得pyflakes等代码检查工具失效。在后续查看代码或者debug的过程中,往往也很难从一堆import *中找到一个第三方函数的来源。可以说这种习惯是百害而无一利的。文件操作文件操作不要使用裸奔的f = open(‘filename’)了,使用with open(‘filename’) as f来让context manager帮你处理异常情况下的关闭文件等乱七八糟的事情多好。野蛮使用class.name判断类型我曾经遇见过一个bug:为了实现某特定功能,我新写了一个class

B(A),在B中重写了A的若干函数。整个实现很简单,但是就是有一部分A的功能无法生效。最后追查到的原因,就是在一些逻辑代码中,硬性的判断了entity.__class__.__name__

== ‘A’。除非你就是想限定死继承层级中的当前类型(也就是,屏蔽未来可能会出现的子类),否则,不要使用__class__.__name__,而改用isinstance这个内建函数。毕竟,Python把这两个变量的名字都刻意带上那么多下划线,本来就是不太想让你用嘛。循环内部有多层函数调用循环内部有多层函数调用,有如下两方面的隐患:Python没有inline函数,所以函数调用本来就会导致一定的开销,尤其是本身逻辑简单的时候,这个开销所占的比例就会挺可观的。更严重的是,在之后维护这份代码时,会容易让人忽略掉函数是在循环中被调用的,所以容易在函数内部添加了一些开销较大却不必每次循环都调用的函数,比如time.localtime()。如果是直接一个平铺直叙的循环,我想大部分的程序员都应该知道把time.localtime()写到循环的外面,但是引入多层的函数调用之后,就不一定了哦。所以我建议,在循环内部,如非特别复杂的逻辑,都应该直接写在循环里,不要进行函数调用。如果一定要包装一层函数调用,应该在函数的命名或注释中,提示后续的维护者,这个函数会在循环内部使用。Python是一门非常容易入门的语言,严格的缩进要求和丰富的内置数据类型,使得大部分Python代码都能做到比较好的规范。但是,不严格要求自己,也很容易就写出犯二的代码。上面列出的只是很小的一部分,唯有多读、多写、多想,才能培养敏锐的代码嗅觉,第一时间发现坏味道啊。

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

python语言太差_Python语言 最差实践相关推荐

  1. python语言是什么语言开发的_Python语言的由来,编程语言简史

    编程语言有上千种,但是流行的不过10来种,那些我们经常使用的编程语言都是谁在什么时候创造出来的呢?Casper Beyer 为我们进行了整理. 1800年 Joseph Marie Jacquard ...

  2. python语言和sql语言的区别_Python语言与其他语言对比

    python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然之路,以下是Python与其他编程语言的优缺点对比: 一:简介 1.Python 优势:简单易学,能够把用其他语言制 ...

  3. python语言合法命名的_python语言合法命名_python合法命名

    CSDN提供了精准python语言的合法命名信息,主要包含:python语言的合法命名信等内容,查询最新最全的python 单下划线结尾_:只是为了避免与python关键字的命名冲突 双下划线开头:模 ...

  4. python 小说人物分析_Python语言之用Python分析一下当年看金庸小说最爱的主角是谁...

    本文主要向大家介绍了Python语言之用Python分析一下当年看金庸小说最爱的主角是谁,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. jieba用起来非常简单,短短几行代码就完 ...

  5. python语言就业方向_Python语言的就业方向是什么?

    一.自动化操作和维护 自动化操作和维护必须精通Python语言.Python是一种非常强大的编程语言.满足Linux操作和维护工程师的工作要求,可以提高效率和提高能力.运营和维护工程师需要独立开发完整 ...

  6. 怎么用python画个电脑_python语言还是java如何用python画爱心

    用python绘制爱心的基本步骤如下: 002pc.com对<python语言还是java如何用python画爱心>总结来说,为我们学习Python很实用. 首先先下载安装好python程 ...

  7. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)

    本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.环境 windows10 python3.5 ...

  8. python语言数据库规模_Python语言访问MySQL数据库

    4.使用python语言访问MySQL 1)pymysql库:Python语言访问MySQL接口 -安装: 在线:pip install pymysql 离线: 第一步:下载安装包,下载地址: htt ...

  9. python高级语言应用报告_Python 语言及其应用 - 第一章

    1.1:Python是一门动态语言(也被称为脚本语言),是一门非常通用的高级语言. 1.2:关于静态语言与动态语言:静态语言要求你必须声明每个变量的类型:它会使用多少内存以及允许的使用方法.计算机利用 ...

  10. python编程定义圆_Python语言编程系列014——PyQt中自定义圆形指示灯

    背景 PyQt是Qt界面库在Python下的绑定库,为熟悉或喜欢Qt的开发者在Python语言下编写GUI界面程序提供了极大的便利,关于自定义控件前面已经给出了两个例子,分别是自定义颜色指示框控件和自 ...

最新文章

  1. seaborn系列 (5) | 柱状图countplot()
  2. python canvas画移动物体_canvas中绘制的图像怎么让它移动?
  3. 网络工程师学Linux 必须掌握命令
  4. DOM——创建节点及节点属性与内部插入append()和appendTo()
  5. 《Windows服务器配置与管理》远程桌面管理
  6. Python基础知识3: if判断语句
  7. 7-28 猴子选大王 (20 分) 最易理解的方法
  8. 群晖NAS详细教程 DSM6.1.7版本(亲测有效)传统BIOS
  9. 35岁的程序员何去何从?--记PMP考试感悟
  10. 转载的java面试题(值得推荐)
  11. python 协程库_python 协程库gevent学习--gevent数据结构及实战(四)
  12. 缺少编解码器,错误代码0xc00d5212 WIN10中AVI格式文件无法播放
  13. python语言编程函数_Python编程语言的函数功能
  14. c语言GLUT头文件下载,GLUT教程.pdf
  15. 集合(Collections)
  16. 真爱如血第一季/全集True Blood迅雷下载
  17. 【CodeChef】【DP】Count Subsequences
  18. css--animate
  19. 【SSR服务端渲染+CSR客户端渲染+post请求+get请求+总结】三种开启服务器的方法总结
  20. 计算广告及搜索广告简介

热门文章

  1. nyoj 523 亡命逃窜 【BFS】
  2. 如​何​计​算​当​地​的​中​央​子​午​线​经​度
  3. 使用OWA无法撰写邮件内容的解决法
  4. 小程序优化处理解决方案1 请求和setData
  5. ExpandableListView点击Group动态获取Child数据源
  6. el-tree多选获取选中的节点ID
  7. Vue学习笔记(组件篇)
  8. C# winform窗体实现图片轮播
  9. oracle如何创建基表,创建本地基表的物化视图
  10. mysql 异步同步_MySQL主从复制异步半同步实例