Python是时下最热门的编程语言之一了。简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题;丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务的首选;强大而活跃的社区,齐全的文档,也使很多编程的初学者选择了它作为自己的第一门编程语言。甚至有国外的报道称,Python已经成为了美国顶尖大学里最受欢迎的编程入门教学语言。

  要学好一门编程语言实属不易,在初学阶段,就纠正一些错误的做法,对今后的深入学习至关重要。有一位叫Constantine Lignos的博主,他是宾夕法尼亚儿童医院放射研究部门的博士后研究员,他最近撰写了一篇很有意义的文章,列举了初学Python的学生们最常犯的错误,并对这些错误进行了分类和剖析,其内容提纲挈领,非常值得每个Python初学者学习。

  这篇文章给出了一些在Python初学者中很常见的反模式,反模式通常是指那些不符合习惯或者会导致糟糕后果的用法。Lignos把他总结的反模式分成了四大类——迭代、性能、变量的漏洞和编程风格。下面我们逐一来看一个例子,理解这些反模式到底“反”在什么地方。

 迭代

  当我们需要简单迭代一个数量范围的时候,Python给了我们一个非常好用的函数:range。Lignos观察到有些初学者喜欢用range来迭代列表的下表,像下面这种形式:

for i in range(len(alist)):
print alist[i]

  这代码现在还没什么问题,但已经不符合Python的习惯了。但下面的代码就有问题了:

alist = ['her', 'name', 'is', 'rio']
for i in range(0, len(alist) - 1): # 漏掉了最后一个
print i, alist[i]

  我们可以看一下Python官方文档range的示例

>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  range的右区间是不包含在内的,如果受了直觉或其他编程语言的影响,再减1就不对了。Lignos还列举了其他几种错误的迭代模式,我们只要记住,range应该用在迭代一个数量范围。

 性能

  Lignos给出了两段代码:

lyrics_list = ['her', 'name', 'is', 'rio']
words = make_wordlist()
for word in words:
if word in lyrics_list: # 线性时间
print word, "is in the lyrics"

  和

lyrics_set = set(lyrics_list)
words = make_wordlist()
for word in words:
if word in lyrics_set: # 常数时间
print word, "is in the lyrics"

  哪种模式效率更高?Lignos注释已经给出了答案。注释的意思是,判断一个元素是否在一组元素中存在,使用list的算法复杂度是O(n),而使用set的算法复杂度是O(1)。那是否set永远是优于list?在其他情况下,应该用哪个数据结构?Python官方Wiki有一份专门各个数据结构操作的时间复杂度的文档供参考,知道参考这份文档比答案本身更重要。至于为什么,只有Python的源码才能告诉我们。

 变量的漏洞

  初学者往往会假设一些不该假设的前提,对一些异常流程考虑不周。Lignos也给了一个例子:

for idx, value in enumerate(y):
if value > max_value:
break
processList(y, idx)

  这里y如果是空的,那就出问题了,因为idx根本得不到定义,最终我们会得到一个NameError的异常。比较好的做法是给idx一个默认的错误值,在C语言里面我们经常喜欢用-1。下面的代码就考虑得比较全面:

def find_item(item, alist):
# 对Python来说None比-1可能更好点
result = -1
for idx, other_item in enumerate(alist):
if other_item == item:
result = idx
break
return result

 代码风格

  Python有一份代码风格指导文档PEP 8,这些规则都是有道理的。当初学者不明白为什么的时候,最好的做法就是尽量遵守它,等到有更深入的理解了就会豁然开朗,同事也会明白什么时候可以打破规则。Lignos引用了这份文档的一些例子,比如,如何测试一个变量是否为空,如果测试一个变量是否为None等等。

  以上分析了这篇文章中的一些例子,如果希望全面了解,请查看原文。想要学好一门编程语言,学会语法是远远不够的,必须逐步理解语言所依赖的CPU体系结构、编译器/解释器/虚拟机等内容。Lignos这篇文章虽然没有深入剖析Python的实现,但是对于入门者的帮助是非常明显的,当初学者有了一定经验后,对一些问题都可以做深入挖掘,引出Python实现层面的问题。

Python编程中的反模式的更多相关文章

  1. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  2. Python编程中 re正则表达式模块 介绍与使用教程

    Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...

  3. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  4. 【转载】Python编程中常用的12种基础知识总结

    Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  5. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  6. 解析Python编程中的包结构

    解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...

  7. Python编程中NotImplementedError的使用

    Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制.在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现.如果要求其子类一定要实现,不实现的时候会导致问题 ...

  8. python编程中的一些有用插件或工具

    windows监控 在python编程的windows系统监控中,需要监控监控硬件信息需要两个模块:WMI 和 pypiwin32 . 前端文件上传插件 krajee karkit 后台管理模板 ni ...

  9. python编程中常见错误

    python编程培训中常见错误最后,我想谈谈使用更多python函数(数据类型.函数.模块.类等)时可能遇到的问题.由于篇幅有限,我们试图将其简化,特别是一些高级概念.有关更多详细信息,请阅读学习py ...

随机推荐

  1. 8天学通MongoDB

    随笔分类 - MongoDB 双十一来了,别让你的mongodb宕机了 摘要: 好久没过来吹牛了,前段时间一直赶项目,没有时间来更新博客,项目也终于赶完了,接下来就要面临双十一这场惊心动魄的处女秀考验 ...

  2. 16_采用SharedPreferences保存用户偏好设置参数

    按钮事件 <Button android:id="@+id/button" android:layout_width="wrap_content" and ...

  3. 监听Activity进入后台(最小化),并根据时间判断是否超时,此解决办法可用于超时重登陆

    通过重写一个继承自Activity的基类中的onUserLeaveHint()方法,当用户按Home键等操作使程序进入后台时即开始计时,当用户使程序恢复为前台显示时执行onResume()方法,在其中 ...

  4. dojo 资源库

    文档 :http://wenku.baidu.com/link?url=Nnek_tAjIC-Q3t3e9zHQmsh4LhU3f0ncC1QH8WD_U9-I8-fJ7mMisscFpgfuS8nU ...

  5. PowerDesigner15使用时的十五个问题

    15个问题列表: No.1:是不是一定要从CDM开始设计,然后在进行PDM的设计? NO.2:工具栏palette不见了,如何把它找出来? NO.3: 如何建立与数据库的关联? NO.4: 域和数据项 ...

  6. 【分享】IT产业中的三大定理(一) —— 摩尔定理(Moore's Law)

    科技行业流传着很多关于比尔·盖茨的故事,其中一个是他和通用汽车公司老板之间的对话.盖茨说,如果汽车工业能够像计算机领域一样发展,那么今天,买一辆汽车只需要 25 美元,一升汽油能跑四百公里.通用汽车老 ...

  7. 源码解析Android中View的measure量算过程

    Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...

  8. 听说noip2015有幻方

    终于可以说一句:pascal大法好了 magic.pp是写好的算幻方哦…… 虽然这种水题大家都会,也没什么卵用……

  9. Chrome 快捷键使用

    窗口和标签页快捷方式 Ctrl+N 打开新窗口 按住 Ctrl‎ 键,然后点击链接 在新标签页中打开链接 按住 Shift 键,然后点击链接 在新窗口中打开链接 Alt+F4 关闭当前窗口 Ctrl+ ...

  10. UIImagePicker照片选择器

    UIImagePickerController 1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType ...