大标:
Python 之旅 (一)文/马儿
世界上有些事物,如同天生具备魔力一般,会让人不由自主地喜欢,Python 便是如此。对某些人而言,挑选一个常相为伴的程式语言,几乎就像‘终身大事’一般重要,以我为例,从 shell script 到 Perl,仅管这些工具已经足以解决日常事务,但总是少了‘感觉’。遇见 Python,才让我有‘就是它,找到了’的亲切感觉,没多久便投身为爱好者。仅管国外的 Python 迷与日俱增,台湾的朋友大多还是对它无甚认识,好东西要和好朋友分享,在此,邀请你和马儿一起踏上 Python 的探险之旅。
一、
Python 两三事起源
Python,大约是在一九九○年代的当头,由 Guido van Rossum 所发明。起初,Guido 原本只是 Amoeba 分散式处理作业系统计画中的一个成员,为了寻找一个较为合适的语言来从事这个计画,由此而触发他设计 Python 这一套程式语言的念头。早期设计上的构想,受到 Modula 程式语言系列的影响,当然也参考到 ABC、Icon 或 Smalltalk 这类物件导向式语言,在技术层面上确实融合多方优点,加上其发展的过程,有兴趣参与的朋友可以从 FTP 站自由取得原始码,或直接在新闻群组上参加讨论,使得 Python 的改版相当积极。直至目前为止,Guido 还是 Python 最关键的发展人员之一,并且组成名为 PythonLabs 的开发团队专注于版本改进。
音意
据一位在美国的网友表示,Python 读音类似 PIEson,在此提出供大家参考。至于以 Python 命名的由来,据 Guido van Rossum 表示,是取自于 BBC 着名的喜剧影集‘Monty Python's Flying Circus’,不过,由于 Python 的字意,最常见的是‘大蟒蛇’,因此 Python 的‘吉祥物’就是‘蟒蛇’的形象了。我认为这是 Python 最大的先天资产,开放源码社群里通常有个好玩的现象:‘专案的领袖最好具备高超的幽默感,以便产生独特的魅力。’这类的行事风格,在 Linux、Perl、Python 的通信论坛里时有所闻。
里程碑
Python 的发展,可以分成几个重要的阶段:
CNRI 时期:CNRI (Corporation for National Research Initiatives) 是资助 Python 发展初期的重要单位,Python 1.5 版之前的成果大部份都在此时期内完成。
BeOpen 时期:后来 Guido van Rossum 与 BeOpen 公司合作,此一期间将 Python 2.0 推出,甚至 Python 1.6 也同时问世,但原则上已经分别维护了。
DC 时期:目前 Guido 已离开 BeOpen 公司,将开发团队带到 Digital Creations (DC) 公司,该公司以发展 Zope 系统闻名,因此这项合作也颇受注目。
社群
Python 的发展,社群是相当关键的力量,为了因应学习及应用领域的日益扩大,由 Python 爱好者所组成的 PSA 提供许多实质的服务功能。PSA (Python Software Assocation) 致力于维护 Python 的发展与支援,成员包括公司团体及个人,而经常性的活动包括 python.org 网站维护、筹修研讨会,并收取会费以支应各项活动的开销。上述协会的日常工作,几乎都是由志工朋友所协助运作,有兴趣参加的朋友,可以造访 http://www.python.org/psa/ 的说明。
PSA 的会员具有一项福利,就是可以免费拥有‘星舰’(Starship Python) 网站上的帐号。星舰网站是由爱好者 Christian Tismer 所创立,舰上聚集各路同好,大家将平常的程式范例、文件资料整理分享,形容为‘Python 梁山泊’应是恰当。

图: 好汉云集的 Starship Python
除此之外,还有 Python Consortium 与 Python Foundation,分别专注于技术规格的发展,以及实质 Python 推广活动的落实及保障。国外对于开放源码专案的重视及支持,已经越来越明确,参与份子包括社群与厂商的共同投入,而且重点在于,他们是以有效而具体的运作方式,确保 Python 这类开放源码专案能不断向前演进,符合多数人的利益。
box
中标:第九届 Python 研讨会
使用 Python 的族群快速增加,这个现象,我们可以从第九届 Python 研讨会中看出个端倪。此次会议于三月八日及九日,在美国加州长岛的希尔顿饭店举行,这次会议当中,除了发表各式 Python 文件及学术报告...等活动的举行外,最主要的目的,就是提供所有来自世界各地的Python 程式设计人员,一个可以相互交换心得的场地。相较于前几届的研讨会,发表之文件及参与的人员,都比历年为多,足见 Python 愈来愈受到重视。如果您想要知道更多研讨会相关资讯,不妨参考 http://www.python9.org/ 网站内容。
box end
二、
Python 的基本特质省却编译连结的步骤
这点主要是与 C 语言这类传统程式语言进行比较,少了 compile 与 link 的步骤,专案开发流程与时效应可改善。不过,实际上 Python 把中介的 byte code 编译动作隐藏,让使用者没有查觉到相关的步骤动作。
省却变数类型宣告动作
这通常是描述式语言采用的原则,在此原则下,Python 程式容易显得简短,并具备弹性。
自动化的记忆体管理
所谓‘garbage collection’,使得程式设计人员不必花太多心思在记忆体管理的议题上。
内建许多高阶而实用的资料型态
善用其内建的资料型态,不但可以节省开发时间,执行效率上也相当令人满意。
轻易结合网路程式模组
热门的 TCP/IP (如 telnet、ftp、mail)、Web CGI scripting 工具、XML 解析器,网路上已有许多 Python 范例等待使用者利用。
物件导向式语言架构
具备物件导式语言的特性,诸如类别、多型、继承等设计,原本熟悉 C++、Java 的程式人员,应可沿用原有的物件概念到 Python 上。
跨平台与图形介面延伸
Python 族群投入极大努力于改进‘跨平台’议题,自然也就成为持续吸引潜在使用者的重要资产,Python 在 Windows 与 Linux 两大平台上的成熟度,差不多可以等量齐观,加上 wxWindows、wxPython 的发展,使用者不但到处都找得到 Python,而且也可以照自己的偏好,选择 Tk、Motif、GTK、Qt、MFC 等图形介面的搭配。
直译式之描述语言
类似直译式描述语言的例子,现在越来越常见而受重视了,如 Perl、REXX、Tcl、Scheme 等,由于 Python 是描述语言的一员,所以只要你之前有相关直译式语言的学习经验,相信概念上可以相通,如果你之前都没学过直译式语言,那么现在正是时候 :-)

图: Python 属于直译式语言,使用者可以在视窗当中进行交谈式互动。
Python 本身是用 ANSI C 所撰写成,目前可以在 UNIX、Linux、MS-DOS、MS Windows /95/98/NT、Macintosh、Amiga、Be-OS、OS2、VMS、QNX...各式不同的平台上编译及执行。这个特质使得大家几乎可以在不同尺寸、不同系统的电脑设备上,操作同样的语言环境,而没有局限的感觉,例如我在一台 486 笔记型电脑上以 DOS 环境执行 Python,让旧设备又多了新动力,倒也是一乐。
Box
中标:系统式语言与描述式语言
过去的十五年中,软体人员在撰写程式上,有了若干的改变,相当明显的一部份,就是程式设计人员,渐渐从采用 C/C++ 等系统式语言 (System Language),改变为采用 Perl 、Tcl、Pyhton 等描述式语言 (Scripting Language) 来撰写程式。在比较系统式语言与描述式语言之际,我们可以发现,传统的系统式程式语言的应用,是因为要用它替代原有的低阶语言 (如组合语言),让程式实际易于撰写维护,因此在型态及结构设计上,都较为严谨;而描述式程式语言的应用场合,主要的目的是为了要“嵌接”现有元件,因此在结构设计上,并没有如系统式语言般的严谨,在整个软体专案发展过程中,可以快速地完成开发目标。
可以这样说,系统式语言节省系统资源,或是发挥系统资源,而描述式语言节省的是‘程式人员的时间’。这年头,程式人员的时间恐怕是相当稀有,但话又说回,发挥系统资源正是资讯家电时代的研发重点,可见的未来,两者必有其专擅之处。
Box end
三、
Python 与其他语言比较原则上,Python 与其他语言之间,合作多于竞争,对于已存在的软体工具或模组,Python 都有机会予以整合,专案开发人员可视实际应用需求,在开发时间、物件重复利用、执行效率、除错效率,不同考量因素之间权变调整。仅管‘比较程式语言的优劣’本身不具太大的意义,但考虑到大家一定会提及这样的问题,所以还是讨论于下,仅供参考 :-)
|
执行效率 |
学习效率 |
物件导向 |
图形介面 |
开发环境 |
大型专案应用 |
函式库工具 |
|
|
Python |
可 |
优 |
优 |
可 |
可 |
优 |
佳 |
|
Perl |
可 |
优 |
可 |
可 |
可 |
可 |
优 |
|
Tcl/Tk |
可 |
佳 |
可 |
佳 |
优 |
差 |
佳 |
|
VB |
佳 |
优 |
可 |
优 |
优 |
差 |
佳 |
|
C |
优 |
差 |
差 |
可 |
优 |
佳 |
佳 |
|
C++ |
优 |
可 |
优 |
可 |
优 |
优 |
佳 |
|
Java |
可 |
佳 |
优 |
可 |
优 |
优 |
佳 |
表:简略的常见程式语言比较表 (优>佳>可>差)
Python V.S. C
、C++传统的 C/C++ 程式语言,在软体资讯世界里,绝对有其根本的重要性,这类系统式语言大抵都有如下的特性:严谨的型态宣告,完整的语法结构,繁复的编译过程。这些特性适于成为系统层面的开发工具,通常也就是中大型的软体专案,如果只是做些快速简易的小型程式,此时搬出 C/C++ 就显得‘杀鸡用牛刀’了。另外,程式的应用领域也值得考虑,如果想要撰写有效率的数值运算程式,里头使用大量的 for 回圈,那么 C/C++ 之类的工具程式仍是首要之选。
由于 Python 程式在执行时,通常处于‘半编译’状态(以 byte-code 型式存在),整体而言,执行效能必定是在 C/C++ 之后,除非是善用内建资料型态的 Python 高手,能够巧妙应用于股掌之间。实务的建议上,对于有意投身软体资讯领域的朋友而言,绝对不可能置身于 C/C++ 语言的影响之外,如何有效结合 Python 与 C/C++ 的应用优势,才是值得思考之处。对于一位已经熟悉传统程式语言工具的程式设计人员们而言,学习 Python 应无任何勉强之感,顶多只是取决于个人时间上的效益评估罢。
Python V.S. VB
Visual Basic 在企业界与 Windows 平台上,应用非常普遍。与 Python 相较,它们同属描述式语言,学习上都很简单,同样精于快速开发的小型程式应用领域,不过,大致有下列的差异处:
1. 两者的基本开发环境有显着不同,VB 是以视觉化的界面做为程式开发的环境,而 Python 传统是以文字编辑器的方式做为开发界面。若是以设计一个具备 Windows GUI 介面的程式为出发,VB 在开发上的确占了许多便宜,从另一个角度来看,若是整个程式包含介面部份,都是由程式设计人员自行撰写的话,则可以在专案维护上,掌握更多的细节。不过实务上,会采用 VB 的环境,八成短时间内也不会有所更动。
2. 如果有‘跨平台’的考量,那么 Python 会优于 VB 之上,如果只是在 Windows 环境执行,那么 VB 自然占有先天优势。据说新版 VB,将在语法结构上进行‘调整’,或许会对 VB 族造成影响。
3. 价格上,Python 一出生就‘自由/免费’了,欢迎任意拷备安装,至于 Visual Basic 的售价,可洽询 Microsoft 的报价说明,目前为止,还不是免费 :-)
Python V.S. Perl
Perl 是 Linux 平台上的语言大宗,由于发展历史悠久,使用族群广大,累积之工具模组十分惊人,加上两者性质与应用场合十分雷同,因此 Perl 与 Python 之间的‘比剑论战’总是迭起无休。以我个人的经验所及,Python 比 Perl 更适于发展大型严谨的应用程式专案,应是无庸置疑,通常问题是在于使用者本身的熟悉度,以及应用程式专案本身的规模上。如果专案规模不大,其实应该没有 Python 与 Perl 孰优孰劣的问题,甚至 Perl 的使用者很容易就可以从 CPAN (Comprehensive Perl Archive Network) 找到合适解决问题的工具,轮不到 Python 上场的机会。
除了外观与应用场合的相似外,Perl 与 Pyhton 在设计哲学及取向上,有着相当大的差异。Perl 语言的设计哲学,强调对原有语言使用者的调整适应,原有 C、shell、awk、sed 的老顾客,几乎可以快速在 Perl 里找到自己熟悉的部份,使得大量的程式开发族群,乐于跨个小步进入 Perl 的世界。Python 在设计上可说是独立的物件式语言,它的模组或语法惯例,肯定是无法为多数 C 语言老手所快速接纳,因此我会建议之前从无程式语言学习经验的朋友,考虑学习 Python 会显得更恰当,至于原本已是 C、Perl 惯用者,八成不必劳心劳力重新学习,而把生产力荒废了。
Pyhton V.S. Java
Python 与 Java 都具备了物件导向及跨平台的特性,不过,Python 在学习、写作、执行的效率上,都优于 Java。在知名度与支援状况,Java 现阶段都处于优势,而且 Java 环境已有相当完整的大型或小型的专业领域应用,显然这是 Python 短时之内难以赶上。若提到开发环境的专业支援,那么 Java 的相关产品可就琳琅满目,因此实务上,Java 会是相当好的专业级选择。

图:JPython 让程式人员同时享受 Java 与 Python 的优势
鱼与熊掌兼得
可以这样想像,传统的 Python 是以 C 语言来实作,因此也有人以 CPython 惯称之,现在则有一套以 Java 语言实作的 Python 程式语言,它被称为 JPython。JPython 维持所有 Python 的特性,差别就在于它是以 100% 纯 Java (一九九八年七月间通过认证) 所实作,以 JPython 和一般的 Java 程式进行互补合作,显得天衣无缝。它的应用场合,主要有下列三种:
1. 提供简化的嵌入式语言环境:Java 程式人员可以将 Java 函式库加进系统当中,以提供应用程式使用者一个直译语言介面,由于其底层以纯 Java 建构,大可放心地考虑将它与应用程式进行镶嵌,而不必担心在 Java 平台上的相容问题。
2. 提供交互式的直译语言环境:透过 JPython 的环境,可以让 Java 程式人员便于进行除错工作。
3. 提供应用程式快速开发环境:Python 程式通常比较简洁快速,撰写时间大多比功能相近之 Java 程式的时间快二分之一以上,这点隐含表示,Python 程式人员比 Java 程式人员更具开发生产力。就算有人执意要以 Java 语言写作程式,JPython 的程式人员同样可以巧妙地与其搭配,在开发程式时将两种任意混用。
有了 JPython 后,多数的程式语言新手们,应该可以稍微松口气,不必在‘既生瑜,何生亮’的矛盾心结里打转,直接学习 Python 即可 :-)
四、取得并安装
Python具备基本概念后,让我们实际找到 Python 玩一玩。绝大多数的场合,在 Linux 环境下是不太需要伤脑筋的,安装好 Linux 之后,大部份的散布套件都会自动为您安装好 Python。以我的环境为例,安装的散布套件版本为 Mandrake 7.2,里头内建的是 Python 1.5.2:
|
python-1.5.2-12mdk |
Python 主要执行档案与函式库 |
|
rpm-python-3.0.5-27mdk |
处理 RPM 包装档案的模组 |
|
python-devel-1.5.2-12mdk |
开发 Python 延伸程式时的标头档或模组 |
|
pythonlib-1.23-2mdk |
内附之应用程式的工具模组 |
|
python-imaging-1.1-2mdk |
提供影像处理能力的 Python Imaging Library (PIL) |
|
postgresql-python-7.0.2-6mdk |
处理 PostgreSQL 资料库连结的模组 |
|
python-docs-1.5.2-12mdk |
Python 说明文件 |
表:Mandrake 7.2 预设的 Python 相关套件内容
在 Linux 的环境下,您只要直接键入 python,就可以进入 Pyhton 的交谈式编辑环境,或者以一般的文字编辑器撰写程式内容后,以 python my_prog.py 方式执行。如果要从交谈式编辑环境离开,请按 Ctrl + D 键 (代表送出 EOF) 即可结束,Windows 的环境则是按 Ctrl + Z 键结束。在 Python 的档案名称惯例中,.py 结尾者内含原始码,.pyc 结尾者为 byte-code 型式的编译档案。
如果,Python 1.5.2 版本无法满足你的需求,或是单纯急于尝新,想见识更新版本中所提供的程式库、函数资源,可以到 Python 总部(http://www.python.org/download/) ,根据自己的作业环境需求,寻找并下载最新版的 Python 程式。
成功下载新版的 Python 档案后,你必须先用 tar 指令进行解压缩的动作,事先阅读 README 档案,并执行 ./configure 以产生 Makefile,最后执行 make 指令将档案完成编译,预设情况下,档案将会被安装在 /usr/local/lib/python<version> 的目录里头。想要顺利执行刚出炉的新版 Python 程式,别忘了仔细检查并设定好 $PATH 环境变数。如此一来,你应该就可以在 Linux 系统里同时拥有 1.5.2 与 1.6.x 或 2.x 的 Python 环境。
Box
中标:如果你是 Windows 使用者
…这里指的是 Windows 95/98/ME/NT/2000 环境,最单纯的安装方式,请下载 BeOpen-Python-2.0.exe 档案,也就是 Windows installer (安装程式),内含 Python 执行档、Tcl/Tk,以及 HTML 格式的文件档案。
如果你是进阶的 Windows 程式开发人员,那么可以考虑加装 Win32 extensions 这套 API 工具组,请下载 win32all-137.exe 档案,其中的 137 为其 build number,此为配合 Python 2.0 的版本。


图:在 Windows 环境下,会安装 GUI 及 command line 两种程式环境。
Box end
五、
Python 的应用实例Zope (Z Object Publishing Environment)
最具潜力者,当属 Zope 这套渐具名气的 Application Server 程式。在大型互动式网站的设计与实作上,Zope 能够提供相当完整的弹性,其物件及模组架构又能让网站管理人员、程式设计人员、内容维护人员,彼此独立作业,相互支援而又互不干扰。它的底层以 Python 物件组成,熟悉 Python 的朋友,甚至可以直接由原始码下手修改,而大多数的情况,是透过其管理介面或 DTML 语法方式,即可快速完成网站的扩充与管理。
Zope 有相当完整的资料库整合功能,透过各式 Product 模组可以与 Oracle、PostgreSQL、MySQL 等着名资料库紧密连结,另外,诸如授权、保安、备份、回复等机制,也在水准之上,堪称开放源码世界里的后起之秀。
有兴趣进一步认识的朋友,可以造访 http://www.zope.org/ 网站说明,Zope 的使用者社群与 Python 社群重叠性颇高,不过,两者仅是关系密切,操作 Zope 倒未必一定要具备完整的 Python 知识。
图: Zope 是一套开放源码版本的 Application Server 程式。
mailman (GNU Mailing List Manager)
传统通信论坛 (mailing list) 的伺服器软体,最着名者有 listserv 或 majordomo,近来 mailman 以其优良的管理及操作介面 (主要透过网页浏览器即可进行),强大的扩充功能,逐渐受到网路服务提供者的青睐,而 mailman 也是 Python 应用程式的一大杰作。此程式有效地展示了 Python 于字串处理与网路支援上的能力,有兴趣的朋友可以到 http://www.list.org/ 一探究竟。

图:mailman 是一套以 python 来开发的通信论坛管理程式
其他应用范例
着名的 Yahoo!mail,其 CGI 程式以 Python 撰写,系统规画结束后,实际程式码撰写仅在数月内完成。FermiLab 采用 Python 撰写系统工具,据程式人员表示,‘撰写过程让人感到通体舒畅’。卡内基美浓大学的 Alice 专案,开发 3D 影像处理系统,以 Python 为工具。另外,Red Hat Linux 的图形安装程式,以及 CLE 计画里的 pDict,都是采用 Python 语言撰写的范例。
六、展望
Python 的未来‘没有一套程式语言是万能的’,学习 Python 的这段时间里,唯一真正说服我自己持续接触 Python 的原因,就只是‘有趣’而已。许多场合中,千万个技术考量,往往比不过一个‘不理性因素’,况且这通常会是最真诚而持久的动力因素。Python 在 2.0 版本问世之后,继续往 2.1 前进,还有令人感兴趣的是,Pippy (Python for the Palm) 的出现,意味着日后的 Python 迷也可以在 PDA 等嵌入式设备里遇见 Python。另外,Microsoft 曾经主导的 COM/DCOM,以及目前在大力推广的 .net 环境,Python 都已经加入整合行列,在在显示,未来的发展之路还很宽广。

图:Pippy 是 Palm 环境上的 Python 程式工具。
Python 的优势,在于它有效满足日常工作的需求,语法上优雅而让人易于学习,适合成为入门程式语言的踏脚石,况且,安装与使用也都不必花钱嘛,找本参考书籍,或是连上网路说明文件,都是一般人能力可及的。有关平台与介面的环境,我会建议以 Python 配合 wxWindows,也就是 wxPython 这套工具,相关的介绍会在日后的专栏中陆续提及,敬请期待。
对新手而言,与其一直伤脑筋‘该学哪种程式语言’,倒不如直接投入学习,Python 确实是一套‘进可攻、退可守’的良好入门工具。台湾的 Python 用户似乎还是很少,这点会造成学习上的困扰,因此,本文除了希望有助于推广之外,也期盼同好们藉此机会齐聚一堂,大家交流心得与经验。
七、
Python网路资源要取得 Pyhton 的相关资源,除了到各大书店里去寻找现成的书籍外,在网路上寻求更新的文件资讯,绝对是聪明的选择,列举几个重要的网址,值得参考看看:
Python 的官方网站
http://www.python.org/
Pyhton 资源的大本营,不论是与 Python 相关的文件资源及程式,大部份都可以由此取得。
Object-Oriented Language: Python
http://www.cetus-links.org/oo_python.html
不看可惜的资源整理。
Python Journal
http://www.pythonjournal.com/
Python 核心发展的线上文件,极具研究价值。
What's New in Python 2.1
http://www.amk.ca/python/2.1/
想知道最新发展版本 Pyhton 2.1 的改进之处吗?
O
’Reilly 的 Python 书籍资讯http://www.oreilly.com/catalog/lpython/
Learning Python 只是一例,市面上已经出现越来越多优质书籍。
Python 教学文件
http://coder.9ug.com/language/script/python/tut_tw/tut.html
入门 Python 极佳的导引资料。
Dive Into Python
http://diveintopython.org/
这个网站上,提供文件给‘具备经验的 Python 程式设计人员’。
除了参考网站上的资源外,利用 BBS 的讨论区,也可以取得不少资讯。请 telnet 到 linux.twbbs.org 或 bbs.cynix.com.tw 站上,寻找 Python 板面,上面有不少的题材,可以供您参考并和他人讨论。