Python语言
如果把高中AppleⅡ上用过的Basic算起,我用过的编程语言应该有十种以上了。
其中工作中用过的有C,C++,pascal(OP/Delphi),java,C#,basic(VB),Unix/Linux shell(awk),perl,python,PHP,javascript,所谓工作中用过的,就是我凭这些语言写的程序赚过钱的。另外自己捣鼓过的还有haskell,F#,scala,Go,D,Object-C,汇编,eiffel等,至于erlang,lisp,prolog,lua,ruby,dart等语言,那就只见过demo程序,自己没写过了。当然,像html,css,xml/xslt,bat,jsp/asp,SQL这样的语言没有被我算在编程语言里。
就我个人来说,我最喜欢Python语言和C语言。D语言看上去不错,不过没什么前途,Go语言也挺好,也许以后会多用,但是现在首先是还没出1.0版(计划2012上半年会出),而且现在Windows上的实现不行,先等会。
Python语言的好处在于表现力强,兼库多且给力。而C语言的好处在于对底层的抽象不多也不少。它们都有简洁的优点,而且不像Perl的简洁,Python代码阅读起来很容易懂,Perl的代码放几个月以后你要重新理解它的语法,会以为当时自己在写天书。
国内主要使用Python的网站中,最知名的就是豆瓣网了,豆瓣的洪强宁这篇QCon BJ 2010的幻灯片已经把Python的特点说得很多,说得很明白,也说得很好了。而至于Python学习的趣味网站,赖勇浩的这篇文章虽然是2008年的了,也是很不错的。
看幻灯片也有点花时间,下面举几个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#注:python的列表和C一样,都是从0开始的。
a=range(10)
#a为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]这样的一个列表
b=a[3:]
#b为从a的第四个元素开始(含第四个)的子列表,即[3, 4, 5, 6, 7, 8, 9]
c=a[:-3]
#c为从a第一个元素开始,至倒数第三个元素(不含)的子列表,即[0, 1, 2, 3, 4, 5, 6]
d=[_*2for_inaif_%3==0]
#d列表的元素为a中3的倍数的元素的2倍,即[0, 6, 12, 18]
e=reduce(lambdar,x:rifx>5elser+x,a,10)
#e为a中所有小于5的元素之和再加上10,即25
|
上面的几行代码看起来很直观,而且也很强大。其中第10行使用到了python的列表推导(list comprehension),第12行使用到了reduce和lambda。
Python对于我而言,工作上主要是用来做各种页面抓取和分析,确实非常舒服。有时候还会用它来做一些日常生活中的事,例如给我刚上小学的儿子出题,让他从小就知道有一个程序员老爸的优势。下面是一道组词成句的题:
1
2
3
4
5
|
importrandom
s=u'我打开柜子拿出杯子打水喝’.split()
random.shuffle(s)
for_ins:print_
|
还有的时候出一些随机加减题来增加他的根骨,要不就是用matplotlib来画一些图给某些商业人士看,等等。
我常用的Python包都在这里有描述,其中也包括了其他的常用软件。最常用的可能就是lxml.html库了,用来处理网页非常方便,简单的处理5行搞定:
1
2
3
4
5
|
importurllib2
importlxml.html
html=urllib2.urlopen("http://blog.raphaelzhang.com").read()
dom=lxml.html.fromstring(html.decode('utf-8'))
|
当然,Python也有很多缺点,在中国Python讨论区里不久前还讨论了一下,就在这个帖子里。Pythoner们怨念值爆棚,比如:
- 字符串编码。对于中国人来说,字符串编码问题永远令人头痛,因为各系统都有自己的缺省编码,各OS的终端,各OS的文件系统,各网站的网页,各数据库的编码,各代码文件的编码,各数据文件与配置文件的编码….
- 并发与性能。CPython本身的性能有待提高,而Python的GIL众所周知,伪多线程使得Python程序无法有效地利用多核系统的优势提高性能,也许只能采用多进程模型,greenlet,gevent,stackless python等框架或PyPy等非CPython的实现了
- 客户端发布。把Python程序发布给没有安装Python环境的用户很麻烦,虽然py2exe可用,但是非常大,而且可能有遗漏,另外GUI实现也有不少性能上的问题
- 接口规范不一致。骆驼命名法,下横杠命名法,都小写命名法,大写开头,小写开头,看起来乱
- 标准库有的有错,有的过时了
- …
不过还是推荐大家多试试Python,虽然它有上述的缺点,但是作为原型开发语言,运维脚本工具,还有Web后端语言来说,都是很棒的。
PS一下,python内建一个非常简单的HTTP服务模块。如果你想临时传文件给别人,可以在文件的目录下运行python -m SimpleHTTPServer
,这样就在本地建立了一个端口为8000的HTTP服务,根目录为本目录,这样用wget/curl之类的软件很快就把文件下载过来了。
再PS一下,我就用python做了一个正文提取+小说下载的软件,自我感觉还成,源代码在这里。下面是正文提取测试程序的部分运行结果:
- 网易新闻的提取结果
- D版小说的提取结果
- Stack Overflow的提取结果
- 猫扑的提取结果
- 天涯的提取结果
- 博客的提取结果
- 论坛的提取结果
下面是小说下载测试程序运行的结果: