Pulpcode

捕获,搅碎,拼接,吞咽

0%

python学习列表

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和相关编程知识进行查缺补漏,如果有被问到的地方,还需要去学习加强。

  1. 你明白python中list的底层实现么?你知道哪些操作(检索?查询?切片?复制?)在list中执行很快,而哪些费时?
  2. 你明白for , try ,if ,while如何使用么?你知道它们的作用域到哪里么?你知道它们都能带有else么?
  3. 你能熟练的操作str么?你能熟练的使用正则表达式,匹配和提取字符串么?
  4. 你能搞清python的编码问题么(utf-8,unicode,gbk,搞不清看我博客)?
  5. 你能搞清python的import机制么?
  6. 你会使用列表生成器么? [ x for x in range(10)]
  7. 你知道xrange和range的区别么?
  8. 你会使用yield么?
  9. 你知道python2.x只得旧式类和新式类有什么区别么?如何定义一个新式类?
  10. 你理解面向的对象的相关思想,封装,继承,多态,接口,抽象类,设计模式,在python中是如何使用和表达的么?
  11. 你知道python class中的内建方法么,init, getitem, setitem,getattribute,他们要如何使用?
  12. 你会使用一些logging,urllib等基本库和requests,ipdb等第三方库么?
  13. 其它的一些语言细节就多看书吧,当然文档是最好的书,如果英文好就直接看文档。

方向定制

数据处理

比如你的方向主要是做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开发的真正重点。

如果你觉得这些你都没问题了,那么可以看看我最近在看的东西:

  1. python元类,metaclass

  2. python装饰器,面向切面编程。

  3. monkeypatch,猴子补丁。

书籍推荐:

初级

《dive into python》
《python基础教程》

中级

《python cookbook》

高级

《python 源码分析》