Python 3 Tutorial 第一堂(2)哈囉!世界!



紙本書《Python 3.5 技術手冊》 已經上市:

Python 3.5 技術手冊

在這個時間點學 Python 還是很尷尬嗎?因為必須面臨學習 Python 2.x 或是 Python 3.x 的問題?

Python 2.x 還是 Python 3.x?

Python 3.0(也就是 Python 3000,或是 Py3k)在 2008 年 12 月 3 日釋出,其中最引人注目的是 Unicode 的支援,將 str/unicode 做了個統合,並明確地提供了另一個 bytes 類型,解決了許多人處理字元編碼的問題,然而,其他語法與程式庫方面的變更,也破壞了向後相容性,許多基於 Python 2.x 的程式,無法直接在 Python 3.0 的環境中運行。

從那時開始,就不斷地有類似的問題出現「我要學習 Python 2.x 還是 Python 3.x?」,由於當時許多程式庫還無法運行於 Python 3.x,多半得到的答案是「學習 Python 2.x,因為許多程式庫還不支援!」,然而若干年過去了,Python 3.x 都來到了 3.5 的版本,隨口一問「我要學習 Python 2.x 還是 Python 3.x?」,還是有人會隨口回答「學習 Python 2.x,因為許多程式庫還不支援!」。

其實,在 Python 官方的持續推動之下,許多基於 Python 2.x 的程式庫或框架,這段期間一直不斷地往 Python 3.x 遷移,像是最近引起我注意的是 Django,其新版本已經支援至 Python 3.4,官方的 Tutorial 也是基於此版本而改寫,一些科學運算套件,像是 Numpy、SciPy 等,也有著支援 Python 3.x 的版本。

想要知道其他程式庫是否有支援 Python 3.x,有個〈PYTHON 3 WALL OF SUPERPOWERS〉可以作為不錯的參考,其中列出了 200 個程式庫,174 個標示為綠色,表示支援 Python 3.x,在 2014 年左右,有 35 個被標示為不支援 Python 3.x 的紅色,目前則只剩下 26 個程式庫是紅色狀態,表示程式庫的支援,確實是有在前進當中。

在 Python 官方的〈Python2orPython3〉整 理了許多相容轉換的相關資源,其中指出,Python 3.0 的一些較不具破壞性的特性,也回饋(Backport)到了Python 2.6之中,而 Python 3.1 的特性,回饋到了 Python 2.7 之中;回饋也反過來從 2.x 至 3.x,例如,在 Python 3.3 中又支援了 u"foo" 來表示 unicode 字串,b"foo" 來表示 byte 字串,相容性同時在 2.x3.x 之間前進著,試著讓語法有更多交集,如果你仔細看過 Python 2.x 版本與 Python 3.x 版本的 changlog,很容易可以發現這類事實。

由於 Python 2.7 預計僅支援至 2020 年,許多程式庫已經在作出遷移的動作,就連作業系統也不例外,著名的 Linux 系統,目前多半也同時預載了 Python 2.x 與 3.x,例如 Ubuntu 從 13.04 起,就預載了 Python 3.x,Ubuntu 也持續移除系統中對 Python 2.x 的依賴,並計畫於 16.04 版本中,能夠全面採用 Python 3.x,而且不再預載 Python 2.x。

當然,一定還是會有死守著 Python 2.x,也宣稱未來絕不的支援的元件或程式庫等,而你也有可能必須面對這些程式庫的時候,然而重要的是,現在的 Python 3.x,已經不再是 2008 年的 Python 3.0,無論現階段你的偏好為何,在遇到「我要學習 Python 2.x 還是 Python 3.x?」的類似問題時,或許不該再隨便脫口而出「學習 Python 2.x,因為許多程式庫還不支援!」,而是該針對(自己或對方的)需求,作個全面性的調查,正如在選擇一門語言,或者是調查某個程式庫是否可以採用時,必須有著諸多考量, 像是更新(update)的時間、修改記錄(changelog)、修正問題(issue)的速率、作者等。

以我個人的建議而言,單就學習 Python 來說,可以先學 Python 3.x,有了 Python 3.x 的基礎,日後有想要再學習 Python 2.x 並不是難事。

Python 的實作

能執行 Python 語言的實作品有不少,接下來介紹幾個主要的實作 …

CPython 是 Python 的參考實作,一 般如果提到安裝 Python,沒有特別聲明的話,指的就是安裝 CPython,顧名思義以 C 撰寫,提供與 Python 套件(Package)與 C 擴充模組的最高相容性。Python 是直譯式語言,不過並非每次都從原始碼直譯後執行,CPython 會將原始碼編譯為中介位元碼(bytecode,也就是 .py 原始碼檔案被 CPython 執行過留下的 .pyc 檔案),爾後再由虛擬機器執行,這點與 Java 有點類似,之後再次執行時,就不用從原始碼而可以從位元碼開始直譯,以加快直譯速度。

PyPy 名稱上來看,是用 Python 實現的 Python,正確地說,是使用 rPython 來實現 Python,rPython 不是完整的 Python,是 Python 的子集,不過 PyPy 可以執行完整的 Python 語言。PyPy 包括一個 JIT(Just-in-Time)編譯器(與 Java 的 HotSpot 技術類似),PyPy 可以將 Python 程式碼編譯為其他語言,像是 C(以及其他語言,例如 CIL、JavaScript),運行速度可比 CPython 要快,為了能進行語言轉換,你必須使用 rPython。PyPy 目的在改進 Python 的效能,同時 追求與 CPython 的最大相容性(這意味著使用 PyPy 還是有相容性上的限制)。就 Python 3 的支援來說,PyPy 是個指標性代表,目前它有 Python 2.7.10 與 3.2.5 的支援版本。

Jython 是用 Java 實現的 Python,可以讓 Python 程式運行於 JVM 上,它會將 Python 程式碼轉譯為 Java 的位元碼(bytecode),既然可以運行在 JVM 上,自然就能匯入(import)取用 Java 的類別,因而利用 Java 領域中龐大的程式庫與各式資源,Jython 的主要開發者之一 Frank Wierzbicki 曾表示,在 Jython 2.7 之後,會認真地開始處理 Jython 3

IronPython 是可與 .NET 平台結合的 Python 開放原始碼實現,可以使用 .NET Framework 程式庫,讓 .NET 其他語言也易於使用 Python 程式庫。IronPython 的創建者 Jim Hugunin 同時也是 Jython 創建者。IronPython 3 是以支援 Python 3 為目標。

準備課程環境

這門課程的作業系統,使用的是 Ubuntu 15.10,使用這個作業系統的原因之一是,希望這門課程能有一個一致的環境,而這個環境不會因為作業系統版本更迭而造成一些初學者 的困惑;原因之二是,Ubuntu 15.10 內建了三個 Python 版本,分別是 2.7.10、3.4.3、3.5.0。

你可以在一台全新的機器中,或者是在虛擬機器中標準安裝,接下來就可以進行後續的課程了,首先開啟終端機:

哈囉!世界!

可以鍵入如下的指令,確認 Python 的版本:

哈囉!世界!

可以看到,Ubuntu 15.10 中鍵入 python 預設是 Python 2.7.10,鍵入 python3 預設是 Python 3.4.3,也可以鍵入 python3.4 使用 Python 3.4.3,鍵入 python3.5 是 Python 3.5.0。

課程的相關範例原始碼都放在 Github 上,因此你要在 Ubuntu 中安裝 Git 客戶端,執行以下指令安裝 git

sudo apt-get update
sudo apt-get install git

安裝完成後,可以使用以下指令下載課程資料(改寫文件的過程中,python3-tutorial 還會持續更新):

git clone https://github.com/JustinSDK/python3-tutorial.git

在編輯 Python 程式碼時,可以使用任何你慣用的編輯器,如果你沒有特別的偏好,或者不熟悉 Linux 下的任一編輯器,那就使用 Ubuntu 內建的 gedit 就可以了。

練習 0:使用 Python 互動交談環境

基本上,這門課程會基於 Python 3.5 來進行,你可以先在終端機中鍵入 python3.5,就會進入 互動式交談環境,先在裏頭輸入 print('hello! world!') 後按 Enter 來個哈囉世界,要離開互動交談環境,可以輸入 exit() 後按 Enter 或按 Ctrl + D,這是本課程的第 0 個練習(因為沒什麼困難度 XD):

哈囉!世界!

練習 1:哈囉!世界!

當然,還是要來建一個原始檔案,寫些 Python 程式,比較像是正式的練習,請使用 gedit hello.py 編輯一個 hello.py 原始檔,然後輸入以下的程式:

filename = input('檔名:')

file = open(filename, 'r', encoding='UTF-8')
content = file.read()
file.close()

print(content)
print(content.encode('UTF-8'))                 # 這是什麼?
print(content.encode('UTF-8').decode('UTF-8')) # 這是什麼?

編輯完成後存檔,這邊暫不解釋程式碼的細節,附帶一提,練習的程式碼成果,都可以在 Github 下載的 python3-tutorial 中取得,舉例來說,這個練習的成果,可以在其中的 labs/solutions/exercise1 中取得。接著,使用 gedit 編輯任何一個檔案,寫寫一些文字(中文英文都可以)之後存檔,我這邊存為 hello 檔案,裏頭寫著「哈囉!世界!」。 接著於終端機中執行 python3.5 hello.py,你應該可以如下進行操作並看到結果:

哈囉!世界!

因為我個人不太相信顯示「Hello! World!」的程式碼越短,就代表該程式語言越容易的鬼話,因此你的第一個程式練習不光只是顯示「Hello! World!」,而是讀取檔案與顯示「哈囉!世界!」,第一個程式就可以正確地讀取檔案與顯示中文,是我個人的偏好,因為這涉及到基本的輸入輸出,也涉及到語言處理文字編 碼的態度,這會讓入門的第一個程式稍微有挑戰性一點!

第一堂課差不多快下課了,剩下的時間,我們來瞭解一下剛剛的 hello.py 寫了什麼,這是下一篇文章的內容了 … XD