Python 程式語言簡介

文章推薦指數: 80 %
投票人數:10人

Python 是什麼? Python程式語言簡介 author:Yung-YuChen(yungyuc)http://blog.seety.org/everydaywork/ copyright:©2005,allrightsreserved 目錄 1   Python是什麼? 2   安裝Python執行環境 3   Python基本語法 3.1   開始撰寫 3.2   檔案處理與字串 3.3   使用模組 3.4   縮排、縮排、縮排 4   Python的應用 5   參考資料 1   Python是什麼? 各位好,今天我們要來介紹Python這一套功能強大、直譯式並且物件導向的程式語言。

你或許聽過,或許沒聽過,但現在有機會來認識它了。

功能強大的直譯式程式語言不只有Python,為什麼我們單單要來介紹它呢?Python有幾項特點: 容易撰寫。

Python具有許多物件導向的特性,然而並不要求一定得用物件導向的方式撰寫。

撇開物件導向的議題不談,Python通常可以靠比較短的程式碼完成比較多的功能,或者可以寫得比較清楚。

功能強大。

Python自1990年由GuidovanRossum在荷蘭的CWI開始發展以來,從0.9進步到今天的2.4.2,不但累積了相當完整的標準程式庫(模組),更有無以計數的非標準模組,而且絕大部分都是開放原始碼的。

單以內建的模組來講,從簡單的數學運算、字串處理、網際網路協定連線、網際網路資料處理、各種壓縮格式,以及POSIX與主要作業系統的支援功能等等,含括的範圍非常地廣泛。

跨平台。

各種主要的作業系統都支援Python。

Python程式常常不需要修改,便可以同時在Linux與Windows平台上執行,即使撰寫GUI程式(透過PyGTK,wxPython等binding)也是一樣。

所撰寫的Python程式透過標準的distutils(模組)進行包裝後,用標準的方式即可安裝於各種平台;在Windows下更可以自動產生方便的可執行installer。

容易擴充。

Python算是執行效率不錯的直譯式語言,但畢竟比不上C和Fortran。

然而只要我們想,大可以C/C++或Fortran撰寫高效率的模組;這些模組的使用方式,與內建模組以及用Python撰寫的模組完全一樣。

最好的是,撰寫的方法並不困難。

2   安裝Python執行環境 如果你使用Linux,特別是DebianGNU/Linux的話,這個環境對Python是非常和善的,只要用apt-getinstallpython即可安裝Python直譯器。

若在安裝Debian的時候有選擇task,那麼Debianinstaller可能已經幫你把Python裝好了。

無論如何,安裝不費吹灰之力。

Debian把Python直譯器拆成好幾個套件:python,python-doc,python-profiler與python-dev。

非開發人員的系統上通常只會安裝python套件,它包含了直譯器程式與相關二進位程式庫;如果我們想寫Python程式的話(這是你在看這篇文章的目的之一,不是嗎?),python-doc與python-profiler也應該要安裝起來。

python-dev包含的則是用來以其它語言開發延伸模組用的部分。

雖然目前最新版的Python已是2.4.2了,但Debian預設的Python版本仍是2.3.5。

Python2.4作了許多增強,但Python2.3的套件(協力套件)支援性還是比較廣泛的。

如果你想使用2.4版的Python(或是倒回去2.2,2.1版),請apt-getinstallpython2.4(可以把2.4改成2.2,2.1,以安裝相對的版本)。

這些不同版本的Python能夠共存在Debian裡,有需要時可以手動叫用。

在其它的Linuxdistribution上,使用預裝的Python即可。

如果你希望自己手動編譯Python,請到下載頁2下載sourcecodedistribution。

熟練的程式員可能喜歡這樣作,然而當你有品質良好的Debian套件可以用的時候,需要自行編譯的機會就不是那麼多了。

Python在2.4以後的版本加入了許多好用的語言功能與模組,在執行效率上也有所增進。

如果你對新的GeneratorExpressions3、Decorators4與其它新增的功能5有興趣,非常推薦使用Python2.4。

這是一本Linux專門雜誌,不過既然要談跨平台能力高強的Python,實在不能不提一下Windows下的Python安裝。

Windows當然是沒有內建Python的,但Windows版Python的安裝和普通的應用程式一模一樣,你只要從Python的下載頁2把安裝程式抓下來,然後執行,所有選項都使用預設值即可完成。

實在非常地簡單。

為了仔細地說明,我們拿Python2.3.5安裝程式來當作範例,請至http://www.python.org/2.3.5/下載Windows版的安裝程式(Python-2.3.5.exe)。

執行了安裝程式之後,我們會看到這個畫面: Python並不大;安裝完畢以後也只佔用了20MB多一點的磁碟空間,所以最好裝在安裝程式所建議的這個位置。

未來我們若自行安裝了任何外加的Python模組或套件,也會放在這個目錄裡面;不過Python套件通常都很小,我們還是不必擔心空間問題。

接著按Next(下一步),選擇是否要備份可能會被覆蓋的檔案: 如果你是第一次安裝Python,當然選不選備份都沒有差別;應該不會有被覆蓋的檔案。

按Next選要安裝的組件: 完全安裝也只需要20MB的空間,我們沒必要就不取消任何一個項目。

最後一個可以選擇的是程式集裡出現的名稱,這就隨你喜好了: 只用了四個畫面就設定完畢,這比安裝遊戲還簡單。

最後一個畫面只是請求確認安裝,按下Next就開始安裝了: 如果你將來後悔了,到程式集裡的Python2.3(看你有沒有改過)就可以找到反安裝程式。

我們順便也展示一下在Windows下安裝Python模組有多簡單。

Python下有一個非常方便的影像處理程式庫:PythonImagingLibrary(PIL)6,我們用它來示範。

因為剛剛示範的是Python2.3,所以這裡也用Python2.3版的包裝檔。

請下載PIL-1.1.5.win32-py2.3.exe檔,點擊後開始安裝: 一開始是歡迎畫面,按下Next後繼續流程,會請求你指定要安裝的Python位置: 我們可以在一台電腦裡安裝好幾個不同的Python;如果你有這麼作,此處便提供一個指定Pythoninstallation的機會。

接下去確認安裝動作: 按下Next以後就開始安裝: 很快就會裝完,最後按Finish即結束安裝動作。

3   Python基本語法 受限於篇幅,本文不可能學一般書籍的作法來列出Python所有的語法元素;我們要用幾個簡單的範例程式,從Python最有特色的地方進行介紹。

由於這麼作無法精確完整地描述Python的寫法,所以推薦你繼續(依序)閱讀葉平(PingYeh)教授的Python教材7(中文)、PythonOnlineTutorial8,以及比較硬的PythonLanguageReference9;另外,DiveintoPython10也是一本可以在網路上免費下載的好書,值得參考。

3.1   開始撰寫 讓我們來寫Python程式吧!Python程式通常會存成.py檔,在Windows下的Python安裝程式會自動把這種副檔名和Python直譯器程式關聯起來,所以在指令行介面(cmd.exe)下輸入"blahblah.py"這樣的字眼,就會執行這個程式。

而在Linux或其它Unix-like的系統裡面,就要再打開該檔案的執行權限(通常以chmoda+xblahblah.py進行)。

不管你使用哪種系統,我們還是先來hello.py一下: #!/usr/bin/envpython print"Hello,world" 執行的結果是(Linux環境): $./hello.py Hello,world 要讓Python程式在Windows下執行的關鍵是副檔名.py,而要在Linux下執行的關鍵除了執行權限要設定之外,還有一個就是hello.py第一行的「標頭」。

在Linux下所有像Python這類的指令稿,在檔案的最前頭都必須要指定所使用的直譯器;在這裡寫為"#!/usr/bin/envpython",表示使用系統路徑裡第一個找到的python直譯器(你的系統裡可能裝了不止一個Python喔),也就是預設的直譯器。

如果沒有這個「標頭」,Linux就不知道它是個Python程式了。

註記 另一方面,在Linux下並不一定要把Python程式的副檔名取為.py;事實上許多以Python指令稿撰寫的軟體都沒有副檔名,乍看之下和一般的程式沒什麼兩樣。

舉個例子,你可以安裝一下meld這個GUI的diff工具,跑起來順得很;如果沒有特別提起,許多人也不會想到它完全是用Python寫的吧。

3.2   檔案處理與字串 再來一個讀取檔案的例子fileproc.py: #!/usr/bin/envpython f=open("/var/log/messages") lines=f.readlines() f.close() forlineinlines: printline 從第2行開始,程式會先打開/var/log/messages這個檔案(Linux的標準紀錄檔之一),然後用檔案物件(open函式會傳回檔案物件,我們取名為f)的readlines()方法一次讀取所有的文字行,然後在第4行關閉檔案。

接著是重要的迴圈敘述;lines是用來存放所有文字行的列表,forlineinlines這個敘述的意思是「一次取lines列表中的一個項目,取名為line」。

在for迴圈敘述後加上冒號,換行然後「縮排」,同一段縮排的程式表示是一個區塊;我們這個for迴圈的區塊裡只包含了一行敘述,就是把line印到螢幕上。

/var/log/messages檔裡的資料應該很多,你會看到一大堆字串跑過螢幕。

這就表示程式執行成功了。

在Windows下,請更換一下open()函式所打開的檔案,只要是純文字檔即可。

註記 Windows和Linux用來分隔目錄的字元是不同的。

在Windows下要用反斜線(\)而非斜線(/)來分隔目錄,不過因為\符號在Python裡表示脫逸字元,所以在雙引號裡,你要用連續兩個的\\才能表示一個反斜線。

否則Python可能會和你抱怨找不到檔案。

Python裡的字串可以用單引號(')或用雙引號(")包圍的文字來表示,效果一樣。

我們接下來要說明Python字串處理能力,順便展示Python的互動式環境。

在Windows下打開指令行介面(cmd.exe),輸入C:\Python23\python;在Linux下的終端機內直接輸入python,都可以進入互動式環境: $python Python2.3.5(#2,Aug302005,15:50:26) [GCC4.0.220050821(prerelease)(Debian4.0.1-6)]onlinux2 Type"help","copyright","credits"or"license"formoreinformation. >>> 在Linux下要跳出時是按Ctrl-D,而在Windows下則是按Ctrl-Z。

通常Python互動式環境的提示符號是如上的>>>。

讓我們試著輸入以下指令: >>>print"abc".split() ['a','b','c'] 字串在Python裡也是一種物件,所以我們可以如上呼叫字串方法split()。

在不加參數的情況下,split()方法會用字串裡的廣義空白(包含空白、跳格與斷行等字元;連續的廣義空白字元視為單一的廣義空白)來把字串斷成多個字串,並傳回包含這些字串的列表。

我們可以指定列表元素的索引值來單獨存取這些字串: >>>print'thisisanapple'.split()[2] an 這樣就取出了編號2的第三個單字"an"。

我們可以把這個技巧應用在之前讀取檔案的程式裡;只要知道檔案的格式,就能篩選出我們想要的字串資料。

如果我們想把字串寫進檔案,首先要用寫入模式來開啟新檔: f=open("newfilename.txt",'w') 再用檔案物件的write()方法來寫入字串: f.write("stringdata") 最後不要忘了close()。

3.3   使用模組 Python模組(module)是一種非常方便的設計;適當地利用模組可以在不汙染命名空間的情況下獲得最多的額外功能。

模組的匯入是利用import敘述: importsys 它匯入了最常用的sys內建模組。

如果我們想處理指令行引數,就要靠sys模組裡的變數argv: #!/usr/bin/envpython importsys printsys.argv 把這個程式存為echoargs.py,然後執行: $./echoargs.pyarg1arg2 ['./echoargs.py','arg1','arg2'] 它把所有的指令行引數都印了出來,以列表的形式。

sys.argv這個變數實際上是個列表,它與C程式main()進入點函式的argv參數有異曲同工之妙,連名字都取作一樣;只是更為好用,因為Python的列表比C陣列自動化得太多,我們不必擔心列表項目的個數問題,Python會幫我們處理好的。

Python還有許多其它的模組,基本上都是以相同的方式匯入並使用的,請參閱線上手冊。

3.4   縮排、縮排、縮排 Python程式語言的一個最大的特色就是以縮排定義程式結構。

不像C,C++,Java等語言用括號定義程式區塊(類別、函式、條件判斷和迴圈等),在Python裡,行首的「空白字元個數」(即縮排)就定義了區塊結構。

許多會寫像 intmain(){ inti; doubled; d=1.d0; i=2; } 這種程式的人一開始會非常不習慣這種作法;但所有程式設計的書都會告訴你程式碼應該要排整齊,亂排只會增加往後維護的困難度而已。

Python強迫程式員把程式寫得漂亮,這不單簡化了往後的維護工作,更去掉了程式裡那些擾人的括號,對減少程式碼長度來說效果良好。

註記 適當地縮短程式碼的行數絕對是好事。

一個函式能在一頁裡列完,就能比兩三頁長的函式更易讀易懂,也更不容易寫錯。

在Python裡, print"Hi" print"hi" 是不合法的,要寫成 print"Hi" print"hi" 才可以。

相對地, if1==1: print"1==1,ofcourse" 是錯誤的寫法,要寫成像 if1==1: print"1==1,ofcourse" 這樣才對。

至於一次縮排要縮多少個字元,Python並沒有進行限制,甚至不同的段落空白不一樣長也可以;只要同一個區塊的行首空白數相同即可。

然而經驗告訴我們,第一,「絕對不要用跳格鍵」,如果你用VIM寫程式,可以用:setet打開跳格鍵的空白取代功能(好一點的編輯器一定都有這種功能,你的編輯器沒有的話,可能該考慮換一個了);第二,縮排字元數要固定。

Python的爸爸GuidovanRossum喜歡用4個字元進行縮排,許多人都覺得這樣很好。

4   Python的應用 本文對Python作了粗淺的介紹,其實還非常地殘缺不全。

你可能仍然不太了解Python,所以最後我們要用一點篇幅來看看目前Python這個語言究竟有用在哪些地方?看過以後,你或許會比較有繼續研究下去的動力。

Zope應用程式伺服器與相關系統。

Zope是一套以Python撰寫的高效率應用程式伺服器,主要用於網頁應用程式的開發;而在Zope之上則有Plone這套全功能的內容管理系統。

Zope與Python的發展息息相關,嶄新的ZopeX3與Python模組系統有相當優雅的結合,即使你對網頁應用程式沒興趣,其程式碼也非常值得參考。

科學計算。

在要求效率的科學計算領域,Python是強力工具。

SciPy,Matplotlib,ScientificPython等等都是專為科學計算設計的套件,而另有一些工具可以用來彌補身為描述式語言的Python在執行效率上先天弱勢的缺點,請參考SciPy網頁上的報告11,基本上可以讓以Python為主體的程式和純C++程式的執行效率差距在10%以內。

Webapplication。

在Python上有許多以網頁應用為標的的計畫,在Pythonwiki上有好幾組列表12,光應用程式框架就有二十個左右,其中Django和Turbogears是近來討論最多的框架,值得注意。

圖形介面程式。

以Python撰寫一般的圖形介面程式是相當理想的選擇。

GTK、Qt和wxWidget等常用的GUI框架都有Pythonbinding,程式員可以丟開複雜的C/C++介面,把記憶體管理交給Python,用最快的速度製作程式的雛形。

若應用環境允許,直接以Python程式碼發行更是方便的選擇。

作業系統管理。

談到作業系統管理很難不提到Perl,Perl一直以來都是Unix-like系統上的瑞士刀,而且是最高級的那一種。

然而Perl程式設計的藝術性也造成了一些問題,Python可能是更輕鬆的另一種選擇。

在處理字串上,Perl仍然勝過Python不少,但在字串處理不那麼吃動的系統上,譬如Windows,配合win32all套件,Python可能就比Perl更合適了。

以上列出的是Python被大量應用的領域;沒有提到的地方代表了筆者的見聞不足,尚請讀者指正。

在下一期的內容裡,我們要來討論一些以Python管理Linux作業系統的技巧;一方面看看如何實際應用Python,再方面進一步地深入Python的程式設計。

5   參考資料 [1]Python:http://www.python.org/ [2](1,2)Python下載頁:http://www.python.org/download/ [3]PEP289GeneratorExpressionsinPython2.4:http://docs.python.org/whatsnew/node4.html [4]PEP318DecoratorsforFunctionsandMethodsinPython2.4:http://docs.python.org/whatsnew/node6.html [5]Python2.4新增項目:http://docs.python.org/whatsnew/whatsnew24.html [6]PIL:http://www.pythonware.com/products/pil/ [7]葉平的Python教材:http://www.ossacc.org/Download/TM/OssaccTM/Python/ [8]PythonTutorial:http://docs.python.org/tut/tut.html [9]PythonLanguageReference:http://docs.python.org/ref/ref.html [10]DiveintoPython:http://diveintopython.org/ [11]SciPy的效能比較:http://www.scipy.org/documentation/weave/weaveperformance.html [12]Pythonwebprogramming:http://wiki.python.org/moin/WebProgramming



請為這篇文章評分?