Python编程中的反模式实例分析这篇文章主要讲解了Python编程中的反模式,详尽描写了反模式的有害并以实例形式具体分析了更容易导致的易错点,对于Python自学来说具备一定的参照糅合价值,必须的朋友可以参照下本文实例描写了Python编程中的反模式。共享给大家可供大家参照。
具体分析如下:Python是时下最热门的编程语言之一了。简练而富裕表达力的语法,两三行代码往往就能解决问题十来行C代码才能解决问题的问题;非常丰富的标准库和第三方库,大大节约了研发时间,使它沦为那些对性能没苛刻拒绝的研发任务的选用;强劲而活跃的社区,齐全的文档,也使很多编程的初学者自由选择了它作为自己的第一门编程语言。甚至有国外的报导称之为,Python早已沦为了美国顶尖大学里最热门的编程入门教学语言。
1/11要懂一门编程语言实属容易,在初学阶段,就缺失一些错误的作法,对今后的了解自学至关重要。有一位叫ConstantineLignos的博主,他是宾夕法尼亚儿童医院放射线研究部门的博士后研究员,他最近编写了一篇很有意义的文章,列出了初学Python的学生们最常犯的错误,并对这些错误展开了分类和剖析,其内容提纲挈领,十分有一点每个Python初学者自学。
这篇文章得出了一些在Python初学者中很少见的反模式,反模式一般来说是指那些不合乎习惯或者不会造成差劲后果的用法。Lignos把他总结的反模式分为了四大类——递归、性能、变量的漏洞和编程风格。下面我们一一来看一个例子,解读这些反模式究竟“反”在什么地方。2/11一、递归当我们必须非常简单递归一个数量范围的时候,Python给了我们一个十分好用的函数:range。
Lignos仔细观察到有些初学者讨厌用range来递归列表的下表,像下面这种形式:拷贝代码代码如下:foriinrange(len(alist)):printalist[i]3/11这代码现在还没什么问题,但早已不合乎Python的习惯了。但下面的代码就有问题了:拷贝代码代码如下:alist=[her,name,is,rio]foriinrange(0,len(alist)-1):#漏掉了最后一个printi,alist[i]4/11我们可以看一下Python官方文档range的示例:拷贝代码代码如下:range(1,11)[1,2,3,4,5,6,7,8,9,10]range的右区间是不包括在内的,如果不受了直觉或其他编程语言的影响,再行减半1就不该了。Lignos还列出了其他几种错误的递归模式,我们只要忘记,range应当用在递归一个数量范围。
5/11二、性能Lignos得出了两段代码:拷贝代码代码如下:lyrics_list=[her,name,is,rio]words=make_wordlist()forwordinwords:ifwordinlyrics_list:#线性时间6/11printword,isinthelyrics和拷贝代码代码如下:lyrics_set=set(lyrics_list)words=make_wordlist()forwordinwords:ifwordinlyrics_set:#常数时间7/11printword,isinthelyrics哪种模式效率更高?Lignos注解早已得出了答案。注解的意思是,辨别一个元素否在一组元素中不存在,用于list的算法复杂度是O(n),而用于set的算法复杂度是O(1)。
那否set总有一天是高于list?在其他情况下,应当用哪个数据结构?Python官方Wiki有一份专门各个数据结构操作者的时间复杂度的文档供参考,告诉参照这份文档比答案本身更加最重要。至于为什么,只有Python的源码才能告诉他我们。8/11三、变量的漏洞初学者往往不会假设一些不应假设的前提,对一些出现异常流程考虑不周。Lignos也给了一个例子:拷贝代码代码如下se4:foridx,valueinenumerate(y):ifvaluemax_value:breakprocessList(y,idx)9/11这里y如果是机的,那就出有问题了,因为idx显然得到定义,最后我们不会获得一个NameError的出现异常。
较为好的作法是给idx一个配置文件的错误值,在C语言里面我们常常讨厌用-1。下面的代码就考虑到得较为全面:拷贝代码代码如下:deffind_item(item,alist):#对Python来说None比-1有可能更佳点result=-1foridx,other_iteminenumerate(alist):10/11ifother_item==item:result=idxbreakreturnresult11/11四、代码风格Python有一份代码风格指导文档PEP8,这些规则都是有道理的。当初学者不明白为什么的时候,最差的作法就是尽可能遵从它,等到有更加了解的解读了就不会豁然开朗,同事也不会明白什么时候可以超越规则。
Lignos提到了这份文档的一些例子,比如,如何测试一个变量否为空,如果测试一个变量否为None等等。以上分析了这篇文章中的一些例子,如果期望全面理解,请求查阅原文。
想懂一门编程语言,学会语法是远远不够的,必需逐步解读语言所倚赖的CPU体系结构、编译器/解释器/虚拟机等内容。Lignos这篇文章虽然没了解剖析Python的构建,但是对于入门者的协助是非常明显的,当初学者有了一定经验后,对一些问题都可以做到了解挖出,引向Python构建层面的问题。
本文来源:Kaiyun·yunkai(中国)官方网站-www.chinazart.net
电话:400-123-4567
传 真:+86-123-4567
手 机:16053484883
邮 箱:admin@chinazart.net
地 址:上海市上海市上海区赛费大楼114号