接触 Python 是两年前的事了。那时因为要写个程式来分析数值资料,开始的时候打算用自己最熟的 PHP,试了几下,很不顺手。后来转用了 Perl,开始的时候都挺顺利的。直至有一天整理程式,想把写好的几个东西整理成一个工具箱给自己用,试了半天就放弃了:根本是精神虐待。反省后觉得自己学 Perl 只会走捷径,打算上网找些基本的学习文件从头努力,但竟然找到了 Python 的网页。就这样开始了学 Python,而且是欲罢不能。现在我要写什么,基本上都是先考虑用 Python,一来实在好用,二来用 Python 写的程式总会有重用的机会,所以手头的工具越来越多,用起来就更得心应手了。
如果你以前只会用 Shell Script 或是 DOS Batch File 而想学些其他的东西,Python 会是你的首选,如果你己经会 Perl 或是 Tcl 或是别的什么,那 Python 会令你改变对 scripting language 的想法。
为什么要学 Python?
答:好玩。就是这样简单。无论是学 Python 还是用 Python,都是一件赏心乐事。当你写 shell scripts 写得鬼哭神号时,当你改 perl scripts 改得头昏脑涨时,有没有想过写 script 其实是很好玩的一件事。你可能从来不相信当你写一套严肃而功能强大的程式,你可以用一个如此好玩的程式语言来开发。更难令你相信的是,就算在程式开发的后期,甚至是几个月以后当你再次想修改它的时候,你依然都会觉得是一件好玩的事。
Python 能做什么?
答:倒不如问,Python 不能做什么? Python 已经差不多把一个 scripting language 作为整合工具 (gluing tool) 的强大功能完全发挥了出来,任何程式,只要有个给 Python 用的接口,Python 就可以把它据为己用,和其他的程式一块使用。而且
· Python 有发展 XML 的大型函式库,并开始有大型系统的构建初型。 · 用 Python 写的 Zope,可以用来架设整个网站 · Python 语言自己是用 C 来写的,但现已有用纯 Java 写的 Python 语言实现,近期更有用微软 .NET 方式实现的 Python 翻译器,由此证明了 Python 语言定义的高度完整。 · Python 已移植到许多的操作平台上,包括 Linux、Windows、HP、Solaris、Irix、AIX、BeOS、甚至是 Cray。几乎和 Perl 一样多。 ·由于 Python 本身是 object oriented,所以很容易和 C++,Java 等整合,尤其在 Visual 当道的 Windows 系统。这点要比 Perl 好许多。
和其他语言的比较
一般的说法的这样的:
Shell script 太旧了,无论如何不能用来写程式。
Perl 擅长做服务器的管理,因为它的字串处理功能特别强大,同时有全面的编程接口和操作系统相连。自己用没问题,就是不懂人家在写什么。
PHP 擅长于网页,因为它可以嵌入在 HTML 文件中并支援各类资料库。但一离开网页就左支右绌。
Python 特别适合一般的需求,因为它语法简明,容易维护,有很多模组可用,而且容易做出图形介面。但它并不是 object oriented 并不纯,速度也较 Perl 慢一些。
Tcl/Tk 基本变数形态只有文字串,每次算术都是从文字变数字再变文字,鸣,没什么好提的了吧。
Java 太伟大了,我可不想每次开始写程式时都幻想要完成一个跨企业的解决方案,引入几十个标头档,写完了才明白原来我只需它读一个用户指定的文件,画两条直线就行了。唉,落差太大。
Ruby 太新了,要正式应用是将来的事。
但事实上我个人的感受最深的是它比较好玩的说法。虽然像是不认真,但一种可以让人寓编程于娱乐的程式语言,正是程式语言的设计终极嘛。
Python 的作者是数学家,而 Perl 的作者则是个天才程式员。因此这两种语言的风格回异:Python 语法铺排的很整洁,相同功能的程式由不同人写出来的样子都很像,这些一致的、前后呼应的程式对于系统的拓展和整合十分重要。因此阅读 Python 的程式感觉上很畅顺。Perl 的语法则很浓缩,而且经常会有些意想不到的巧思,可惜这些每每体现在字里行间的妙着对整个程式的可读性带来负面影响。因而一个短小的 Perl 程式往往令人爱不释手,但当它越来越长时总会变成程式员的永痛。
至于PHP,因它的发展历史一直是围绕着 web page,所以做网页设计是十分方便的,但是写一般的工作则平平无奇。比如说控制执行绪,处理进程间的讯息传送以致做图形用户介面等都久奉,这是因为从 WEB 的角度,这些并不重要:图形介面,HTML 就己经是了,而程式的执行和互相合作则是 Web Server 要考虑的事。
我推荐 Python 是因为我觉得它比较适合用作一般性程式编写和系统整合,尤其是在科学和教育领域中。我并不是说大家没本事学好 Perl,只是很多时候我们并不需要用到 Perl 的精妙之处,更多的时候用一个清楚直接的描述要比用一个智力题级的招数更有好处。除了语法的设计较为整洁外,Python 还有很好的对电脑图形的支援,也有十分快的数学阵列模组。
而它最方便的地方是很容易的把其他的程式整合在一起,譬如说你有个几年前写的 C 程式,只要修改很小的一部份就可以编译成 Python 可用的模组。事实上已经有自动帮你做这些修改的程式了,人们也己为许多各种好用的函式库做出了 Python binding,如 OpenGL、GTK、QT、GD、甚至于解方程组的、找频谱的都有。
而在使用了一段时间后,我开始体会下面的说法:
‘Python 是设计出来的,而 PHP 和 Perl 是累积而来的。’
虽然它们各自都有类似的功能,但在使用时会发现 Python 的写法总是较为一致,这是因为 Python 从一开始便考虑了它整个的架构。相反,像 Perl 或 PHP 则有很多功能都是后来慢慢加上去的,所以到后期 Perl 的发展越来越难,以致 Perl 6 几乎要从头设计。而 PHP 则现在才开始头痛于构思新的函数名称 (所有的 PHP 函数都是全域定义的,所以每加一个函数都有可能和已经定义了的名字重复)。为了解决问题,它们各自都开始注意加强 class, object 的支援。但很明显的是,在程式成熟后再加这些基本功能会令整个语言的框架变得头重脚轻,无论是写起来还是用起来都有些不稳的感觉。
然而 Python 在一开始的时候就把这些考虑了进去:Python 根本就是以物件导向作为设计的基础。因此在加了许许多多的功能和模组后,它的风采仍旧,清新依然。
好话说了不少,光说不练可是不行。参考程式示范区的实际例子,看看 Python 到底是怎样一回事。