2010 年 5 月 5 日更新:我翻译了一篇《<Dive Into Python>非死不可》做为对本文观点的进一步支持和对评论的回复,请见:http://blog.csdn.net/lanphaday/archive/2010/05/05/5558617.aspx
做者:赖勇浩(http://blog.csdn.net/lanphaday )html
不管是在国内人气最旺的 Python 社区 python-cn google group,仍是在 CSDN 的脚本论坛,都不时有新加入的朋友咨询有没有什么 Python 书比较好,回复的贴子里,确定少不了《Dive into Python》(如下简写为 DIP,且不加书名号)。今天我要说的是它不值得推荐的理由:它太旧了,并且内容编排至关古怪,全书来看缺少大局观,我没见认是靠它入门的,最后还有很是重要的一点——推荐者可能根本不在工做中使用 Python。python
在第一章,咱们能够看到这本书基于 Python 2.2 或 2.3 版本编写。当前 Python 最新的发布版是 2.5.2,2.6/3.0 版本也计划在今年 10 月发布,这当中相隔的版本太大,使得不少书中推荐的编码形式、性能要点都再也不成立了。程序员
其实这本书做者到 2004 年就没有再作更新了,时隔四年,对于一个开源的脚本语言来讲,产生的变化足以用山河变换来形容。在 manuals 中能够看到许多特性都加 new in 2.3/2.4/2.5 的注脚,不客气地说,DIP 已经不合时宜了。web
写这篇文章的时候,我参考啄木鸟网站的DIP 5.4b 版本(http://www.woodpecker.org.cn/diveintopython/index.html ),这是 DIP 最新的中文版。其中第2章的例2.1,以下:正则表达式
这里至少有两处没有充分利用新版本特性,一处是 myParams 的定义,续行符让代码变得丑陋,另外一处是 join() 函数的实参无须构建一个新的列表,损失了性能。算法
这本书里不只没有 new-style class,也没有function decorator;没有谈有用 Unicode 字符串,却有 UserDict 这样的老掉牙的实现。除了这此跟不上时代之外,还有一些内置函数、标准库都没有使用最新的。当 DIP 先入为主,读者会认为代码就应该这样写,以至出现大虾不识 enumerate() 的状况家常便饭。s数据库
DIP 的第一个例子(即上文的例2.1)足足花了两章才可以彻底说明。其中至少有以下概念:函数定义、变量定义、docstrings、字符串、字符串格式化、字典、字典迭代、列表、列表包含、元组、分枝语句、循环语句、程序入口、预约义系统变量等。哦,天啊!这是一本定位于初学者的书的第一个例子吗?而你居然还向初学者推荐?我很是怀疑你对 DIP 一书是否真的足够了解,有没有深刻地读一下这本书。编程
虽然我很钦佩做者居然能找到一个如此精妙的例子,短短几行代码居然包括了十余个 Python 特性,另外还有隐含的对数据库知识的了解。Coooooooool!但这种酷例子只会把大部分初学者吓得远而避之。性能优化
除了这个例子外,再举一个内容编排古怪的例子——就是第4章“自省的威力”。第3章刚讲完了内置数据类型,加上第2章的基本语法、函数定义等内容,立刻就应该到 Python 的特色之一:面向对象了吧?做者他偏不,读着读着,只是奇峰突起,来了个神也怪也的“自省”。如此大起大落、婉转曲折,做者应该去写章回小说,何须来写个教程凑热闹。硬着头皮读下去,发现例4.1是一个有更多 Python 特性的小例子,不知又有多少初学者在此打道回府?网络
你们知道一篇好文章,须要一条主线,全部的情节都是为主线服务的。写一本书也差很少,内容应当为主题服务,既然书名定为 Dive into Python,那天然应该多讲讲 Python 的知识点。但全书的第7到12 章三分之一的篇幅讲了正则表达式、HTML、XML、HTTP web 甚至 SOAP web等具体应用,并且至关多内容是与 Python 无关的、独立的协议的讲解。哦,那您老还不如写本书叫《Python 与 web 开发从入门到精通》。
这本书缺少大局观的另外一个表如今于它花了中间的三分之一的篇幅讲 web 以后,最后三分之一的内容却又开始阳春白雪起来,彻底抛弃了 web 相关的内容开讲单元测试、测试驱动开发、重构、函数式编程、性能优化等主题。不得不说这些话题很是有意思,但一堆松散的珍珠并不能让你光芒四射,只有用一条金钱把它们穿起来,造成一体,才能彼此相得益彰。
一个国内 Python 社区很有声名的高手如此评价 DIP:“我以为 DP 最大的问题是该讲的没讲, 不应讲的乱讲。”在一本有着许多发光点的书也许可让读者开拓眼界,但也每每致使他们变得眼高手低。觉得本身什么都见过,真正开干却又无从下手。Python 是拿来用的,应当多介绍经常使用的模块,DIP 则是一本看完之后无法用的书。
好吧,这本书从 2000 年到2008 年的今天已经走过了 9 个年头,不知道多少人靠它入门了?我没有作过统计,只能在下文讲讲我掌握的状况;但读者您不妨在文章后面匿名留言,看看比较大众化的状况。
我以前在一个使用 Python 至关普及的公司任职,在入职以后才学的 Python。由于我是经过校园招聘进去的,因此同时去的有一大批应届生,几乎所有不懂 Python。后来咱们也没有使用 DIP,固然,咱们都学会了 Python。跟老员工熟悉了以后,加上后来在公司呆的几年,了解到公司几乎没有人用这本书。
虽而后来在网络结识了许多 Pythoner,但也仍然没有听过谁是靠 DIP 学会 Python 的。这样的事实让人不得不怀疑你们对 DIP 推荐有加其实只是以讹传讹。s
像 google 的pagerank 算法,推荐 DIP 的人自己靠 Python 谋生的话,才会有说服力。我固然不知道推荐 DIP 的人是否真的靠 Python 谋生,但我这个不推荐 DIP 的人却正是靠 Python 谋生。
专业的人才能有专业的推荐,若是推荐者在本职工做中并不使用 Python,那它的推荐就像一个内蒙古人推荐的帆船,夏威夷的性感沙滩妹推荐的马,你以为信得过吗?
咱们能够不读 DIP 仍然弄懂 Python,起码说明了 DIP 并不是必读书目,你没必要由于曾经被 DIP 吓退而放弃 Python,咱们彻底有更好的选择。
指出同样事物的不足不是难事,难事是推荐一个替代品。DIP 的替代品是 Python manuals 中自带的 Tutorial,甚至你仍然能够找到它的中译版。Tutorial 的好处包含但不限于如下几点:
1) 它是最新的,并且会在出新版本的时候第一时间更新;
2) 它是官方的,出自 Guido 和其余 Python 主力开发者之手,没有人比他们更有能力带你 Dive into Python,不是吗?
3) 它的内容编排按部就班,行文平实,读起来虽然没有跌荡起伏的快感,但可让你轻松上路;
4) 它的内容覆盖面广,这一点远胜 DIP;
5) 我和个人大部分同事都是靠它走入了 Python 的殿堂,因此这是真正的实践者的推荐;
6) 许多我认识的靠 Python程序员跟我同样认为这才是真正的好教程,固然,他们靠 Python 谋生或曾靠 Python 谋生。
若是你非要找一本能够捧在手上的书,那么一本好的 Python 书的标准是要么在广度上有建树要么就是深度。广度上来讲,《Python编程金典》作得不错;深度上, 《python cookbook》和《可爱的 Python》系列文章比较好。而DIP 这种四不像让人看完后只会更迷惑,由于 Python 是拿来用的, 因此深度和广度是比较重要的。而 DIP 以入门为幌子,可是不像“金典”具备极高的可操做性。若是难以动手操做,天然不能很好地掌握知识,那么做为入门书也就变成扯淡了。