大標: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. CC++

傳統的 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 的改進之處嗎?

OReilly 的 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 板面,上面有不少的題材,可以供您參考並和他人討論。