Introduction
有朋友想学python,但不知如何学起,想要一个python的学习列表,我想了一下,决定写一篇博客。
首先我写的不是“如何成为python高手”,而是作为一个已经入门的初学者,如何继续下一步提高,一是因为我的朋友很明显没有想成为一个python高手,二是因为我不是python高手,所以我也不知道如何才能成为python高手。
所以我这篇博客完全是私人定制.
我还要强调一点的是,学习技术绝对不是随便闭关几天就能学成的。我算写了6年代码了,但是依旧觉得自己什么都不知道。
why python?
python是一个动态,解释型语言,相比于java和c++,它更加灵活,更容易拥抱“变化”,互联网行业的兴起使得python在这两年越来越火,(将来可能还会更火)。
但同时要注意的是,由于它过于灵活,所以在很多比较“正规”的领域很少使用python,这些领域只有c++,java,c#这样的静态语言才能胜任。别听那些所谓google的许多项目是用python实现的,或者豆瓣这么大的网站就是用python实现的
之类的言论。实际上,python在大型项目上也就做做胶水语言,写个业务逻辑。项目做大了,python这种没有静态类型检查的,效率又低的动态语言,简直是噩梦。
说这些的目的是为了说明,一定要理解python的优势是什么,如何去用它为你带来收获,避免走过多不必要的弯路。
你的方向
千万不要把语言作为你的方向。
千万不要把语言作为你的方向。
千万不要把语言作为你的方向。
重要的事情说三遍,你的方向一定是和行业相关的。曾经的我就走了不少弯路在上面,实际上技术是一个无敌洞,企图通过学完某个技术列表,就成功成大牛的。想法很是可笑。
首先按照一个学习list的方向学习,很难坚持下去,枯燥,又有挫败感,还没有对比性,也不知道自己学的到底怎样。再说,很多技术,不是说学了将来以后一定会有用,实际上真没什么卵用。
那么我说的行业是什么意思呢?比如说我的一部分同学没有单纯的学习c#,而是主修地理信息,然后通过实际需求来把c#当成一个工具,我觉得这就是一个好的方向。
所以你也要抓住某一部分业务,熟悉这其中的来龙去脉,而把python当作一个辅助工具,比如农业行业数据分析。比如金融相关业务。
基础知识
以下用疑问句的方式,来对python和相关编程知识进行查缺补漏,如果有被问到的地方,还需要去学习加强。
- 你明白python中list的底层实现么?你知道哪些操作(检索?查询?切片?复制?)在list中执行很快,而哪些费时?
- 你明白for , try ,if ,while如何使用么?你知道它们的作用域到哪里么?你知道它们都能带有else么?
- 你能熟练的操作str么?你能熟练的使用正则表达式,匹配和提取字符串么?
- 你能搞清python的编码问题么(utf-8,unicode,gbk,搞不清看我博客)?
- 你能搞清python的import机制么?
- 你会使用列表生成器么? [ x for x in range(10)]
- 你知道xrange和range的区别么?
- 你会使用yield么?
- 你知道python2.x只得旧式类和新式类有什么区别么?如何定义一个新式类?
- 你理解面向的对象的相关思想,封装,继承,多态,接口,抽象类,设计模式,在python中是如何使用和表达的么?
- 你知道python class中的内建方法么,init, getitem, setitem,getattribute,他们要如何使用?
- 你会使用一些logging,urllib等基本库和requests,ipdb等第三方库么?
- 其它的一些语言细节就多看书吧,当然文档是最好的书,如果英文好就直接看文档。
方向定制
数据处理
比如你的方向主要是做python的数据处理。那么首先数据库才是你的重头戏,而非python.你要熟悉mysql,除了使用数据库的增删改查,熟练的使用联合,子查询来从数据库拿出数据,你还要学习如何建立索引,从而高效的查询数据库,还有事务处理。
数据处理包括将数据展示成报表,想像一下,如果上级给你一个任务,你能快速的生成一个可读性很强的报表,而不是随便丢给他一些数据,那么你就能很快的得到领导的重用。
还有为了和数据库交互,你要明白如何用python来操作数据库,mysqldb,那么熟悉这些api就很重要了,除非你记忆力很好而且用的很熟练,否则建议你将一些范式代码收集起来,忘记的时候,经常查阅。
容器操作,你要明白,你主要是在做数据处理,所以list,tuple,dict才是你经常要玩的东西。因为学c++的缘故,我将这些东西统称为容器(也就是存放其它变量的变量)
那么这三种基本容器的操作你要会吧?,尤其查找,切片。尤其是排序。
列表生成器你要会用吧? [i**2 for i in range(10)]
还有对字符串的操作,str的普通操作就不说了,正则表达式也是必须的。
函数式编程的基本工具,map, reduce filter
你要会用吧?
你要学习函数式编程的那套思想,把你数据处理的逻辑,封装成一个一个函数,你的数据最后能像流一样从一边流入,再从一边流出,那你才牛逼了。
那么你要熟练的使用yield,如果你连range和xrange有什么区别都不知道,那么你离理解yield还有很大的一段距离。
还有要注意的是效率,你如果把数据库或者文件中的数据一次读入,那么你的内存肯定是吃不消的,但是如果你一条一条的读,那么又是非常慢的,(io是瓶颈)
如何避免不必要的内存拷贝,如何在空间和时间上做权衡,提升效率都要考虑这些的。当然这要在满足业务之后了。
web开发
web开发要涉猎的地方要比数据处理多一些。
首先你要熟练使用一门web框架,python的web框架虽多,但是目前最火的就三个, django, flask, tornado。
其中,django类似于ruby on rails的一站式框架。“随便”配几下,orm,界面的什么都有了,很适合做业务系统。
flask中有大量的插件,可以方便的配成你想要的web应用,而且flask的源码写的非常好,仅仅是借鉴源码都能让你收获甚多。
tornado是我目前使用比较多的一个web框架了。作为框架而言,确实几乎没什么,但是它确实是一个不错的web服务器,得意与异步非阻塞特性,ioloop可以处理高并发和长链接。知乎的通知系统应该就是使用的tornado来做长链接消息推送。
除了服务器,就是数据库了,单纯的使用数据库(mysqldb)或者使用强大的orm(sqlalchemy)
接下来的基本功,就是写好业务逻辑了,这是一个漫长的过程,如何用好try..catch,如何打好日志,如何写好单元测试。
等你熟练了web开发,就应该去学学web开发的底层知识了。比如http协议相关的,以及早期互联网是如何使用cgi来做web服务的,fastcgi又改进了哪些?
python的wsgi模型为什么可以保证web框架和web服务器”随意”插拔(wsgi的这个设计来源于java的servlet),你甚至可以去读读flask的源码和tornado的源码。
去写一个tcp服务器,去写一个web服务器,写一个简单的web框架。
当然做web开发,比这更基础更重要的,其实是业务需求的设计(uml活动图,状态图),代码结构设计(面向对象与设计模式),和数据库建模与优化。这就不属于python范畴了,但它才是web开发的真正重点。
我
如果你觉得这些你都没问题了,那么可以看看我最近在看的东西:
python元类,metaclass
python装饰器,面向切面编程。
monkeypatch,猴子补丁。
书籍推荐:
初级
《dive into python》
《python基础教程》
中级
《python cookbook》
高级
《python 源码分析》