总结一下自学Python的路径。
零基础入门Python。
下面列出的所有资料中,有一部分是从头到尾全部读完的,也有一部分是他人推荐结果学了一部分就学不下去的,但所有的评价全是个人的亲身体会,希望能够给准备入门Python的朋友们一些参考。
推荐下我自己创建的Python学习交流群627044331,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。
刚开始学习Python的时候,并没有直接开始找书籍找公开课,而是花了很多时间纠结一个问题,到底该学Python 2还是Python 3?当时纠结的原因无非是Python 2将在2020年就不会被维护了很明显Python 3才是未来主流,然而市面上大部分关于Python的资料都是基于Python 2的。
但说实话,虽然距现在只过了半年,我认为现在入门的朋友已经完全不需要纠结这个问题了,直接开始Python 3吧,Python 3已经获得了绝大部分库的支持,很多原版Python教程也早就已经过渡到Python 3了,只是中文版本的翻译还会滞后一段时间。
而且Python 2和Python 3在入门级别的区别极其小,如果想两个版本都了解也用不着花很多时间,无非也就是什么python 3的print不再是语句(statement)而是函数(function)所以要加括号,python 2的两个整数用除法符号/相除时返回整数除法的结果而python 3返回小数形式的结果等等,
我思来想去还是决定从Python 2开始,选择的第一个Python学习资料是《Learn Python the Hard Way》(中文译名:《笨方法学Python》),结果学到第三十章左右的时候看到一篇报道说Instagram已经完成了对Python 3的全部迁移,于是又转到了Python 3版本的《Learn Python the Hard Way》重新开始学。虽然又一次从头开始学浪费了一些时间,但这也不算踩过的坑,因为如上所说Python 2和Python 3在入门级别的区别其实只在一些比较小的地方,所以第二次重新入门Python所花的时间比起第一次少了很多。
而《笨方法学Python》这本书非常的神奇,对它的评价很多都是两极化,喜欢的夸上天,讨厌的贬下地,因为它的风格确实和其它编程书籍大相径庭。正常的编程书更加注重语法,每一页的字里行间都是知识点,而《笨方法学Python》更注重操作,要求读者照着每一页的代码完整打一遍,然后根据输出页面的结果学习语法,可能每一章只能学到四五个新的知识点。
对于完全没有编程经验的人来说,这本书在第40章之前还是很友好的,因为没有密密麻麻的知识点看得脑袋疼,减少了很多挫败感,自己打代码然后看着屏幕上的打印出的结果所获得的成就感也更强。在为零基础的人建立对编程的兴趣方面来看,这本书也许比其它编程书要好得多。
但是这本书缺点也很明显,
第一,按照作者的指示用终端得到的打印出的结果来学习的话,学到的部分可能大多都偏向于print相关的知识点,然而对IPython这种交互式的命令系统输出的结果少了很多了解。
第二,每一章涉及的知识点太少,不少初学者应该了解的关键功能或语法都被一带而过,结果是这本书我已经读了一半了,但是对Python语法的了解还是非常表面。基础薄弱和理解不深这个问题在第41章开始OOP的时候终于全面爆发,哼着小曲抖着腿轻轻松松十分钟理解整章知识点的日子一去不复返,跟Class抗争两天后我在前四十章建立的所有自信都被击碎。
后来我没有选择接着跟这本书死磕下去,于是进度永远地停在了第41章。现在想来这也算是一个正确的决定,零基础入门的朋友可以通过这本书的前四十章开启Python入门之路,虽然能学到的东西比起其它编程书来看要少很多,但是对于新手来说,在早期自信心和兴趣的建立要重要得多。而且由于作者通篇的讲解不多,读者就被逼着要去做各种搜索,以真正理解文中提到的语法概念,而搜索技能的培养,也是对新手来说非常必要的一件事。
官方出版的中文版只更新到了2014年的第三版,语言是Python 2,所以只推荐想学Python 2的朋友去买实体书,
中断了《笨方法学Python》的学习后,我意识到自己对Python的语法概念还需要加强理解,于是又开始找网上的公开课资源。当时找到了很多人推荐的两门公开课,edX平台上MIT的Python基础课程《MITx: 6.00.1x Introduction to Computer Science and Programming Using Python》,和Harvard的计算机入门课程《CS50: Introduction to Computer Science》,两门课都针对计算机科学的初学者。我看了一下两门课的教学大纲后,果断选择了MIT的6.00.1x,因为首先CS50用C语言,而且涉及的广度非常大,还会介绍和了解Python,SQL,JavaScript,CSS和HTML,然而我担心几门语言一下子会冲乱我对Python语法的记忆,于是放弃了CS50,导致现在都不了解这门课的质量到底如何。不过它在网上的评价非常高,对于想从更广更远的角度了解计算机科学的朋友,也许这门课可以去试一试
找到MIT的6.00.1x时正好是这门课刚开课的时候,讲解语言是Python 3,每周都有很多个5到10分钟的视频讲解,讲解者是MIT的执行校长和电气工程与计算机科学系主任Eric Grimson,每周视频的总时长加起来大概两个小时左右,有中文字幕可以选择,每个视频讲解后面都会跟一到两个练习页面,然后每周都有一个Problem Set要做。
这门课的确是我迄今为止发现的最好的Python入门课程,因为Professor Grimson讲解清晰,随堂PPT列出的知识点也很直观。即使有些知识点没有在视频里全部带到,在视频结束后也会以练习的形式呈现,且练习附上了标准答案。这种通过视频学习然后立刻用finger exercise进行演练的方式既把概念和语法学的全面,又能立刻让学这门课的人明白刚刚学到的知识是如何运用的。
而且这门课的进度比起《笨方法学Python》要快得多,具体有多快呢,我在《笨方法学Python》前四十章学到的东西,6.00.1x第一周的视频里就全部覆盖了。再具体一些来说,这门课第一周学循环,第二周学递归,而多伦多大学的Python入门课程CSC108一个月以后才开始学循环,结果还没有MIT在第一周里面讲解的内容清晰(暗搓搓地黑一波自个儿学校)。
这种进度在一开始可能会让新手有些不知所措,第一周会比较难熬。但也因为这样,我才会推荐零基础的朋友先去把《笨方法学Python》的前40章先看完,这样至少第一周的皮毛你已经知道了,剩下的时间只用去深入理解教授的讲解。而且刚开课的不久就要完成的第一个Problem Set的难度看起来也是有些吓人,我第一周的时候把那几道题目盯了两三个小时,但是依旧一点思路都没有。因为Problem Set和视频后面练习的模式不一样,在截止日期之前是不给标准答案的,于是我迫不得已去搜索答案,在别人的GitHub页面找到了答案粘贴了上去后,又把那几行代码反反复复看了十几遍。茅塞顿开的那一刹那心里的想法是,原来编程不是像《笨方法学Python》那样一味的print东西,而是像一道数学题一样解决问题啊。后来第二个Problem Set就能摸出点门道来,把第一个Problem Set收集到的经验和技巧都用上了,比如可以设立boolean flag,break和continue在什么时候可以用上之类的,然后后面的Problem Set对我来说也就越来越容易了。
所以给希望修这门课的零基础的朋友的建议是,先熬过前两周,后面就会变得容易起来,这真的是一门非常非常值得学习的课程。
写这个答案的时候这门课已经结课归档了,但是仍然可以查看所有视频,课后练习也可以提交,系统会自动改分。但是相比起开课的时期,首先归档期没有助教,你可以在每个页面下面的论坛上查看先前的学生提出的问题,但是在结课后提出问题的不会有助教来回答。第二个是Problem Set在正式提交区不会被系统批改(因为截止日期已经过了),如果想知道完成的Problem Set是否正确的话可以去课程页面拉到最下面的Sandbox区,那里提供过期提交作业的系统批改。第三个是拿不到认证证书,这门课程是免费的,但是如果想拿到认证证书需要在结课前的几个星期以前交50刀,但归档期完成课程也不提供认证证书。想拿证书的朋友可能还是得等待正式开课,可以先放在收藏夹里时不时点开检查一下有没有更新的开课时间。正式开课的话,课程跨度在两个月左右。
不介意证书的朋友就不需要等正式开课,在归档期也可以开始学习。归档期的课程材料不会按周进度锁定,因此不需要按照课程规定的进度,也没有Problem Set的截止日期。
我在完成6.00.1x后,还想再巩固一下Python基础,于是又开始陷入了后续该读哪本书学哪门课的纠结。想到以前学HTML和CSS的交互式教学网站Codecademy,但是Codecademy的Python没有更新到Python 3版本(截止至18年1月依旧没有),而且学完6.00.1x后Codecademy的内容已经过于简单了。
然后又开始读不少人推荐的《Python基础教程》(英文书名:Beginning Python From Novice to Professional)。这本书的中文版只翻译到了第二版,语言是Python 2,于是去找了英文版的第三版,语言已经更新到了Python 3。
这本书如果不算后面的项目,一共只有三百多页,但是覆盖了很多的高级内容,包括了GUI,数据库,网络编程等等。然而我并不想那么快扩展到Python的高级内容,这本书的基础内容又不够详尽,于是又开始找其他资料。
后面又找到了《Python核心编程》和《Python Cookbook》。当时在知乎上看到很多人推荐新手读《Python核心编程》,没怎么细翻就去书店买了一本回来。买回来后仔细一看目录傻了,里面全是Python高级内容,第一章就是正则表达式,第二章是网络编程。又回到知乎一查,原来推荐给新手的是第二版,第三版虽然更新到了Python 3,但也移除了所有Python基础内容。
不过也没有后悔买这本书,因为日后进阶到Python高级内容想学Web开发的时候这本书也许是一个可以选择的参考资料。
《Python核心编程》中文版第三版 Python 3
《Python Cookbook》不是一本针对于Python新手的教程书,但是是一本非常非常好的参考书。截取一部分目录如下,可以看到这本书旨在帮助Python程序员解决问题,涉及到一些算法和编程技巧,也包含了一些Python高级内容,比如第二章出现的正则表达式。新手可能不太适合通过这本书入门或是巩固基础,但是对于有经验的程序员,这本书可以当做问题解决手册来查阅。
<img src="https://pic4.zhimg.com/v2-f8ca742bdd480049dc8c0b2048b31153_b.jpg" data-caption="" data-size="normal" data-rawwidth="1210" data-rawheight="1174" class="origin_image zh-lightbox-thumb" width="1210" data-original="https://pic4.zhimg.com/v2-f8ca742bdd480049dc8c0b2048b31153_r.jpg">
前面一段提到的所有书籍都是自己并没有从头到尾读完的,之所有列出来是希望给那些听说过这几本书又不知道该不该购买和学习的朋友提供一些参考。后面自己真正从头到尾学完(除附录的高级部分)的一本书是《Python学习手册》,也就是程序员口中的老鼠书(因为封面图案是只大老鼠)。
这本书可能是市面上对Python基础语法讲解的最详尽的一本书,光是使用入门就在第一部分用了八十几页来介绍(我读了十页后忍无可忍跳过了第一部分)。第二部分的第一章开始粗略介绍Python的对象类型,然后在接下来的几章中,又各用了完完整整的一个章节去介绍某一对象类型,比如数字,字符串,列表和字典,等等。第三部分介绍语法,第四部分函数,第五部分模块,第六部分类和OOP,第七部分异常和工具。这些都是Python的基础内容,但是作者对于每一个概念都恨不得把官方文档的所有点全部挑出来一个一个讲,比如最基础的打印操作print,作者把print函数所有的可选参数和其默认值全部列了出来,比如可以选择sep = ...,end = ...,以及如何通过修改file参数的默认值sys.stdout来重新定向输出流。
而且这本书还兼容了Python 2版本和Python 3版本,也就是说作者把Python 2和Python 3在某些部分的差异清楚地列了出来,特别是迭代器在不同版本之间差异。
但是详尽也意味着:1. 作者有些时候非常啰嗦; 2. 这本书相当相当厚。不包括高级内容的中文版第四版有889页,不包括高级内容的英文版第五版有1162页。我当时每天五个小时左右来读这本书,花了也大概有三个多星期才读完,而且有些内容在平时编程并不常用,读完就忘了,比如字符串格式化的键、属性和偏移量在添加时的具体格式。
但是把这本书完整读下来的好处也有很多,比如Python有些内置函数所带参数的默认值虽然在平常一般不会去修改,但至少自己会知道这个参数是存在且可以修改默认值的,在日后编程过程中为有些功能的实施带来了可供选择的便利方法。而且前一阵在网上看到了一篇Python面试问题总汇,里面的概念性问题在老鼠书里基本都有提到,所以如果不是急着进阶高级内容且有足够的时间去慢慢啃基础的话,这本书依旧值得推荐。
除了上面列出的Python基础参考资料以外,还建议预备役程序们把英语学好。不用花太多时间去看美剧练口语,只要能把计算机相关的英语词汇全部熟记且达成无障碍阅读英文文档的水平就可以。
因为如果英语水平过关的话,首先能读懂官方文档,其次可以无障碍去stack Overflow搜索问题,而且可以读到很多国外计算机大牛的技术博客。希望英语不会成为大家未来的学习道路中阻碍。
最后总结一下我推荐的零基础入门Python的路径:
初探门路- 读完《笨方法学Python》的前四十章
系统入门 - 完成edX公开课平台上的6.00.1x Introduction to Computer Science and Programming Using Python
查漏补缺 - 读完《Learning Python》