参考视频
Python3 从入门到精通视频教程千里马:Python3 从入门到精通视频教程zhuanlan.zhihu.com
从大年初二开始学习Python,到现在正好一个星期了,谈谈我的学习体会。
一、学习缘起
最早听说Python是在今年1月底到北京一个厂商(做汽车驾驶模拟器的)那里看设备,听他们的CTO介绍模拟软件的脚本控制是用的Python,(当时我还把Python叫做“飞森”,而不是“派森” 囧)。第一次听说了这个语言,但也没太在意,因为导师一直跟我说用好一门语言就够了。从上大学到现在,先后用过C、Basic、C++以及ASP(一看就不是计算机专业的,我大学认识的几个计算机专业的同学,大多都是Pascal - Delphi - Java这条路线)。这几年主要在用C#,觉得C#还不错,又可以做本地程序,也可以做http://ASP.NET程序,所以也没想再学其他语言了。
寒假做了一个交通网络分析的计算程序,这个程序前期已经有一些基础了,核心算法用的是QuickGraph库。QuickGraph提供了经典图论里边的绝大部分算法,如最短路、最大流、遍历、支撑树等,不错的一个东西,但是没有复杂网络分析的算法。一开始我是利用QuickGraph的数据结构,然后自己写复杂网络分析算法。但是写的很累,正好也过年了,就暂时放下了这个工作。
过年的时候闲着没事,上网找是不是有直接提供复杂网络分析算法的库,还真找到了两个:igraph和networkx。(见http://igraph.sourceforge.net/和http://networkx.lanl.gov/),其中,igraph是用C写的,但提供了Python的接口;networkx就纯粹是用Python实现的一个库了。下载了它们的文档,发现正是我想要的东西:成熟的复杂网络分析算法,大量的示例程序。要想直接利用这两个库,肯定要学Python语言了。我想,反正各种语言都差不多,学就学吧。
二、语法
学语言肯定要先从基本语法学起。Python的语法的确很简单,因为有C#编程基础,学习起来没遇到什么困难。比起C#,Python少了花括号,完全靠缩进解决结构问题。一开始我不太习惯,特别是写函数定义、循环控制等语句时总丢后边的冒号。现在好多了,习惯会慢慢养成(现在变成写C#程序总加冒号,然后调试器就开始不停的问候我 囧)。另外Python没有switch,因为我做科学计算,涉及到条件控制比较多,一开始用ifelifelif……觉得很烦人,后来发现用dict就很方便,比switch还要简单优美。
说到dict呢,顺便说一下Python内置的list、tuple和dict类型。这个的确很方便,在C#里做同样的事情要引用Collections,而Python就简单的多了,对于做科学计算的确简化了许多工作。不过Python用类型不事先定义,一开始我还是不太习惯,总是int a,str b的,后来发现,这不就是C#里的generics嘛!是个好东西啊!而且Python的函数功能也很强大,有匿名函数、多返回值、列表内涵、关键字参数等等,极大的简化了编程工作。最早在STL、Boost及C#里看到这些特性的时候我还惊为天人,学了Python才知道这东西也没那么神秘——基本手段嘛。
此外,Python还有一个很nice的功能就是exec、execfile和eval。对我来说这个非常实用,因为做计算时总有些函数需要在运行时才导入,例如y =a +func(b),func()的形式事先不知道,运行时根据用户需要输入。以前用别的语言实现这个功能要费好大劲(用表达式解析器等),现在Python直接内置了它。换句话说,Python可以作为Python程序自己的脚本语言!Python实在也太强大了!正如那句Python社区中很有名的话所说的:“battery included”!要我说,Python不仅带了电池,充电器它TMD都带着呢!
三、库及跨平台
Python的第三方库很多,特别是计算这一块,Python比C#的库要丰富一些,而且用的人更多。我现在已经用了igraph和networkx(图论与复杂网络)、numpy和scipy(数值计算)以及matplotlib和cairo(图表和可视化),python(x,y)项目里还集成了更多的科学计算库。当然这和搞科学计算的老外大多用非windows平台有关,我接触的多数人都是用unix/linux平台(给人家发Email都不好意思带word附件),在这些平台下虽然有Mono支持C#,但用的人毕竟还少。C和Fortran的科学计算库倒是不少,不过多数都提供了Python的封装或Python写的替代品,所以就不需要自己重复造轮子了。我现在已经完全放弃了扩展那个QuickGraph的想法,因为我再作两年也赶不上igraph和networkx,而且关键是我做的东西还没人用 囧……
此外,Python可用的GUI库也很多:Tkinter,wxPython,PyQt,PyGTK,PyWin等等一大堆。除了PyWin,大多数GUI都是跨平台的。这点很好,再也不用担心MS卡脖子了(偶现在还是在用D版,以后限制严格了就到Linux下接着做这点事),自己的知识、技术可以一直积累延续,而不用从头开始。当然GUI库不可能都学都用,学好一个应该就够了。试了上面几个库后,我选择了PyQt4,原因是看到它Demo里做的东西比较漂亮,而且Qt的信号/插槽(signals/slots)机制也比回调(callback)机制好理解。此外,对初学者很重要的一点是,Qt的中文书比wxPython要多。注意不是PyQt,PyQt的中文书还是比较少的。wxPython我只找到了一本很厚的《wxPython In Action》。书是不错,不过我比较怕看厚书,因为时间总是有限的,最好都是In Nutshell之类的小册子,头天睡前翻一翻,第二天就可以写出想要的东西来。
四、Web开发
我学Python的主要目的是为了做一些数值计算的小程序,因为做网络分析总是要对大量的数据进行分析计算,Python简洁的语法和丰富的第三方库可以极大地提高我的工作效率。不过作研究只是为了兴趣,要养家糊口还是要做一些短平快的项目(惨!)。这两年做的比较多的就是与工程相结合的Web应用(因为我导师的方向是GIS与交通设计信息化)。以前一直是用http://ASP.Net在做,从1.0到2.0再到3.5,一路做下来对http://ASP.Net已经比较熟了。因为学Python,也特意关注了一下Python的Web开发功能。
现在看来似乎Django很热(这个我又不知道应该怎么念,不过恰好我有个朋友叫“邸建国”,所以我第一眼看到Django就念成这个音了 :)。
百度百科上介绍说“Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则”。听上去不错,上网找到了Python高手
limodou的《Django Step by Step》教程,粗看了一下没有入门,暂时还是先用我的ASP.Net吧,因为我感觉目前ASP.Net可用的资源更多,对我来说更加DRY。以后有闲了再慢慢跟“邸建国”切磋。
五、体量和效率
因为做科学计算,我很重视语言及开发环境的“轻量级”。什么叫“轻量级”呢?对我来说就是在我256M内存的老本上能欢快地跑起来 囧……。我的烂机是单位淘汰的一台联想昭阳V80,CPU是P4 1.6的,让他跑.Net 3.5的确是难为他老人家了!所以在这台机器上我主要用Dev C++和SharpDevelop(Visual Studio在这台机器上启动都很困难)作数值计算的程序。我的另外一台本本是小黑X61,这个性能还可以,我用它上网、写论文、玩游戏等等(不过X61的显卡很弱,做OpenGL的程序时得到单位的工作站上,当然玩实况和FIFA也得去那个工作站上:)。因为大规模网络分析花的时间会比较长(几小时到几天),这些计算的脏活累活就扔给V80了。现在用Python,IDE我选了PythonWin和Spyder(见我的另一篇文章),感觉这两个IDE还比较轻量,很适合我的硬件环境。
Python的运行效率我感觉和C#差不多,因为都用了虚拟机,但Python比C/C++还是要差一截。我对比了igraph(C写的)和networkx(Python写的)两个库,生成同样规模的一个随机图,igraph比networkx运行时间少一个数量级(Drew Conway做的对比结果也类似,见这里)。换句话说,对于大规模的网络分析问题就是等几小时和等几天的区别了。不过还好,大多数老牌的科学计算库都是用C和Fortran写的,并且提供了Python接口,所以也不必太担心。我们可以把Python当作“胶水”[1]来用:对于效率要求很高的部分,就调用C/C++库或自己写C/C++的模块,这也是我选择Python语言的一个主要考虑。
六、总结
作为一个刚从C#转到Python的FreshMan,一周来的总体感觉就是:Python的确易学、易用、强大。像我这样的非计算机专业毕业、非程序员工作的人,一星期就已经入门Python,并且能用它写出自己“用着方便、看着舒服”的程序。很符合我学Python的预期:提高自己的工作效率;也印证了Bruce Eckel的观点:“Python可能是唯一一种旨在帮助程序员把事情弄得更加简单的语言”[2]。