一般的 Python 常見問答集

一般資訊

什麼是 Python?

Python 是一種直譯的、互動的、物件導向的程式設計語言。它結合了模組、例外、動態型別 (dynamic typing)、非常高階的動態資料型別,以及 class(類別)。它能支援物件導向程式設計之外的多種程式設計典範,例如程序式 (procedural) 和函式語言 (functional) 程式設計。Python 結合了卓越的功能與非常清晰的語法。它有許多系統呼叫和函式庫的介面,以及各種視窗系統的介面,並且在 C 或 C++ 中可以擴充。它還可以作為一種擴充語言,使用於需要可程式化介面 (programmable interface) 的應用程式。最後,Python 是可攜的 (portable):它能運行在許多 Unix 的變體上,包括 Linux 和 macOS,也能運行在 Windows 上。

要尋找更多內容,請從 Python 教學開始。Python 初學者指南可連結到其他介紹式教學以及學習 Python 的資源。

什麼是 Python 軟體基金會?

Python 軟體基金會 (Python Software Foundation) 是一個獨立的非營利性組織,它擁有 Python 2.1 版與之後各版本的版權。PSF 的使命在於推展 Python 程式設計語言相關的開放原始碼技術,以及宣傳 Python 的使用。PSF 首頁的網址是 https://www.python.org/psf/

在美國捐款給 PSF 是免稅的。如果你使用了 Python 且發現它很有用,請至 PSF 捐款頁面為它做出貢獻。

當初為什麼 Python 會被創造出來?

以下是由 Guido van Rossum 所撰寫,關於這一切如何開始的非常簡短的摘要:

我在 CWI 的 ABC 小組中擁有實作直譯語言方面的豐富經驗,而透過與該小組的合作,我學到了很多關於語言設計的知識。這是許多 Python 功能的起源,包括使用縮排進行陳述式分組以及納入非常高階的資料型別(儘管在 Python 中的細節都已經不同)。

我對 ABC 語言有一些牢騷,但我也喜歡它的許多功能。想要擴充 ABC 語言(或其實作)來去除我的抱怨是不可能的。事實上,缺乏可擴充性就是它最大的問題之一。我有一些使用 Modula-2+ 的經驗,也與 Modula-3 的設計者交談過,並閱讀了 Modula-3 的報告。Modula-3 就是用於例外及另外一些 Python 功能的語法和語義的起源。

我當時正在 CWI 的 Amoeba 分散式作業系統小組工作。我們需要一種比編寫 C 程式或 Bourne shell 腳本更好的方法來進行系統管理,因為 Amoeba 有自己的系統呼叫介面,而它無法簡單地從 Bourne shell 進行存取。我在 Amoeba 中處理錯誤的經驗,使我深切地意識到例外作為程式設計語言功能的重要性。

我突然想到,一種具有類似 ABC 的語法但可以存取 Amoeba 系統呼叫的腳本語言將能滿足該需求。我了解編寫 Amoeba 專用語言是愚蠢的,所以我決定,我需要一種可以廣泛擴充的語言。

在 1989 年的聖誕節假期,我有很多自由時間,所以我決定來嘗試一下。在接下來的一年裡,雖然我大部分時間仍然在為此而努力,但 Python 在 Amoeba 專案中的使用得到了越來越多的成功,且同事們的回饋也使我為它增加了許多早期的改進。

在 1991 年 2月,經過一年多的發展,我決定將它發表到 USENET。其他的記錄都在 Misc/HISTORY 檔案中。

什麼是 Python 擅長的事情?

Python 是一種高階的、用途廣泛的程式設計語言,可以用來解決許多不同類型的問題。

這個語言提供了一個大型的標準函式庫,涵蓋了字串處理(正規表示式、Unicode、檔案之間的差異計算)、網際網路協定(HTTP、FTP、SMTP、XML-RPC、POP、IMAP)、軟體工程(單元測試、日誌記錄、效能分析、剖析 Python 程式碼)以及作業系統介面(系統呼叫、檔案系統、TCP/IP 插座 (socket))等領域。請查看 Python 標準函式庫 (Standard Library) 的目錄,以了解可用的函式。此外,還有各式各樣的第三方擴充。請查詢 Python 套件索引 (Python Package Index) 來尋找你有興趣的套件。

Python 的版本編號系統是如何運作的?

Python 各版本會被編號為 "A.B.C" 或 "A.B":

  • A 為主要版本編號 -- 它只會在語言中有真正重大的變更時才會增加。

  • B 為次要版本編號 -- 只有在影響範圍較小的變更出現時增加。

  • C 為微小版本編號 —- 會在每個錯誤修正發布 (bugfix release) 增加。

並非所有的發布版本都是錯誤修正發布版本。在一個新功能發布版本的準備階段,會發布一系列開發版本,標示為 alpha、beta 或候選發布版本 (release candidate)。Alpha 是介面尚未最終化的早期發布版本;看到兩個 alpha 發布版本之間的介面變更並不會令人意外。Beta 則更為穩定,保留了現有的介面,但可能會增加新的模組,而候選發布版本會被凍結,除了需要修正關鍵錯誤之外,不會再進行任何變更。

Alpha、beta 和候選發布版本都有一個額外的後綴:

  • Alpha 版本的後綴是 "aN",其中 N 是某個較小的數字。

  • Beta 版本的後綴是 "bN",其中 N 是某個較小的數字。

  • 候選發布版本的後綴是 "rcN",其中 N 是某個較小的數字。

換句話說,所有標記為 2.0aN 的版本都在標記為 2.0bN 的版本之前,而 2.0bN 版本都在標記為 2.0rcN 的版本之前,而它們都是在 2.0 版之前。

你還可以找到帶有「+」後綴的版本編號,例如「2.2+」。這些是未發布的版本,直接從 CPython 的開發儲存庫被建置。實際上,在每一次的最終次要版本發布完成之後,版本編號將會被增加到下一個次要版本,並成為「a0」版,例如「2.4a0」。

请参阅 Developer's Guide 获取更多有关开发流程的信息,并参阅 PEP 387 了解更多有关 Python 的向下兼容策略的信息。 另请参阅有关 sys.version, sys.hexversionsys.version_info 的文档。

我要如何得到 Python 的原始碼複本?

最新的 Python 原始碼發行版永遠可以從 python.org 取得,在 https://www.python.org/downloads/。最新的開發中原始碼可以在 https://github.com/python/cpython/ 取得。

原始碼發行版是一個以 gzip 壓縮的 tar 檔,它包含完整的 C 原始碼、Sphinx 格式的說明文件、Python 函式庫模組、範例程式,以及幾個好用的可自由發行軟體。該原始碼在大多數 UNIX 平台上,都是可以立即編譯及運行的。

關於取得和編譯原始碼的詳細資訊,請參閱 Python 開發人員指南中的 "Getting Started" 段落

我要如何取得 Python 的說明文件?

Python 目前穩定版本的標準說明文件可在 https://docs.python.org/3/ 找到。PDF、純文字和可下載的 HTML 版本也可在 https://docs.python.org/3/download.html 找到。

說明文件是以 reStructuredText 格式編寫,並由 Sphinx 說明文件工具處理。說明文件的 reStructuredText 原始碼是 Python 原始碼發行版的一部分。

我從來沒有寫過程式,有沒有 Python 的教學?

有許多可用的教學和書籍。標準說明文件包括 Python 教學

要尋找 Python 程式設計初學者的資訊,包括教學資源列表,請參閱初學者指南

有沒有 Python 專屬的新聞群組或郵件討論群?

有一個新聞群組 (newsgroup),comp.lang.python,也有一個郵件討論群 (mailing list),python-list。新聞群組和郵件討論群是彼此相通的——如果你能閱讀新聞,則無需加入郵件討論群。comp.lang.python 的流量很高,每天會收到數百篇文章,而 Usenet 的讀者通常較能夠處理這樣的文章數量。

新的軟體發布版本及事件的通知,可以在 comp.lang.python.announce 中找到,這是一個低流量的精選討論群,每天收到大約五篇文章。它也能從 python-announce 郵件討論群的頁面中訂閱。

關於其他郵件討論群和新聞群組的更多資訊,可以在 https://www.python.org/community/lists/ 中找到。

如何取得 Python 的 beta 測試版本?

Alpha 和 beta 發布版本可以從 https://www.python.org/downloads/ 取得。所有的發布版本都會在 comp.lang.python 和 comp.lang.python.announce 新聞群組上宣布,也會在 Python 首頁 https://www.python.org/ 中宣布;RSS 新聞摘要也是可使用的。

你也可以藉由 Git 來存取 Python 的開發版本。更多詳細資訊,請參閱 Python 開發人員指南

如何提交 Python 的錯誤報告和修補程式?

要回報一個錯誤 (bug) 或提交一個修補程式 (patch),請使用於 https://github.com/python/cpython/issues 的問題追蹤系統。

關於如何開發 Python 的更多資訊,請參閱 Python 開發人員指南

是否有關於 Python 的任何已出版文章可供參考?

也許最好是引用你最喜歡的關於 Python 的書。

最早討論 Python 的文章是在 1991 年寫的,但現在來看已經過時了。

Guido van Rossum 和 Jelke de Boer,「使用 Python 程式設計語言互動式測試遠端伺服器」,CWI 季刊,第 4 卷,第 4 期(1991 年 12 月),阿姆斯特丹,第 283–303 頁。

有沒有關於 Python 的書?

有,很多書已經出版,也有更多正在出版中的書。請參閱 python.org 的 wiki 在 https://wiki.python.org/moin/PythonBooks 頁面中的書目清單。

你也可以在網路書店搜尋關鍵字「Python」,並過濾掉 Monty Python 的結果;或者可以搜尋「Python」和「語言」。

www.python.org 的真實位置在哪裡?

Python 專案的基礎建設遍佈世界各地,由 Python 基礎建設團隊管理。詳細資訊在此

為什麼要取名為 Python?

當 Guido van Rossum 開始實作 Python 時,他也正在閱讀 1970 年代 BBC 喜劇節目「Monty Python 的飛行馬戲團」的出版劇本。Van Rossum 認為他需要一個簡短、獨特且略帶神秘的名字,因此他決定將該語言稱為 Python。

我需要喜歡「Monty Python 的飛行馬戲團」嗎?

不需要,但它有幫助。:)

在真實世界中的 Python

Python 的穩定性如何?

非常穩定。自從 1991 年開始,大約每隔 6 到 18 個月都會發布新的穩定版本,而且這看起來會繼續進行。從 3.9 版開始,Python 每隔 12 個月將會釋出一個新功能發行版本 (PEP 602)。

開發人員會釋出針對先前版本的錯誤修正發布版本,因此現有發布版本的穩定性會逐漸提高。錯誤修正發布版本是由版本編號的第三個部分表示(例如 3.5.3,3.6.2),這些版本會被用於改善穩定性;在錯誤修正發布版本中,只會包含針對已知問題的修正,並且會保證介面在一系列的錯誤修正發布版本中維持不變。

最新的穩定發布版本隨時都可以在 Python 下載頁面上找到。Python 有兩個生產就緒 (production-ready) 的版本:2.x 和 3.x。推薦的版本是 3.x,此版本能被那些最為廣泛使用的函式庫所支援。雖然 2.x 仍然被廣泛使用,但它已不再被維護

有多少人在使用 Python?

可能有幾百萬個使用者,但實際的數量是難以確定的。

Python 是可以免費下載的,所以不會有銷售數據,而且它可以從許多不同的網站取得,並與許多 Linux 發行版套裝在一起,所以下載次數的統計也無法反映完整的情況。

comp.lang.python 新聞群組非常活躍,但並非所有 Python 使用者都會在該群組發表文章或甚至閱讀它。

有沒有任何重要的專案使用 Python 完成開發?

要查看使用 Python 的專案清單,請參閱 https://www.python.org/about/success。藉由查詢過去的 Python 會議記錄可以看見來自許多不同公司和組織的貢獻。

備受矚目的 Python 專案包括 Mailman 郵件討論群管理員Zope 應用程式伺服器。有一些 Linux 發行版,最著名的是 Red Hat,已經用 Python 編寫了部分或全部的安裝程式及系統管理軟體。內部使用 Python 的公司包括 Google、Yahoo 和 Lucasfilm Ltd。

Python 未來預期會有哪些新的開發?

請至 https://peps.python.org/ 參閱 Python 增強提案 (Python Enhancement Proposal, PEP)。PEP 是用來描述一項被建議的 Python 新功能的設計文件,它提供了簡潔的技術規範及基本原理。請尋找一篇名為「Python X.Y Release Schedule(發布時程表)」的 PEP,其中 X.Y 是一個尚未公開發布的版本。

新的開發會在 python-dev 郵件討論群中討論。

對 Python 提出不相容的變更建議是否適當?

一般來說,不適當。全世界已經有數百萬行 Python 程式碼,因此在語言中的任何變更,若會使現有程式的一小部分成為無效,它都是不被允許的。即使你可以提供轉換程式,仍然會有需要更新全部說明文件的問題;市面上已經有很多介紹 Python 的書,而我們不想一下子就把它們都變為無效。

如果一項功能必須被變更,那麼一定要提供逐步升級的路徑。PEP 5 描述了要引進反向不相容 (backward-incompatible) 的變更,同時也要對使用者的擾亂最小化,所需遵循的程序。

Python 對於入門的程式設計師而言是否為好的語言?

是的。

學生們仍然普遍地會從一種程序語言和靜態型別語言 (statically typed language) 開始入門,這些語言像是 Pascal、C,或是 C++ 或 Java 的某個子集。透過學習 Python 作為他們的第一個語言,學生們可能會學得更好。Python 具有非常簡單且一致的語法和一個大型的標準函式庫,最重要的是,在入門程式設計課程中使用 Python 可以讓學生專注於重要的程式設計技巧,例如問題的分解和資料型別的設計。使用 Python,可以快速地向學生介紹基本觀念,例如迴圈和程序。他們甚至可能在第一堂課中就學到使用者自訂的物件。

對於以前從未進行過程式設計的學生來說,使用靜態型別語言似乎是不自然的。它使學生必須掌握額外的複雜性,並減慢了課程的節奏。學生們正在試圖學著像電腦一樣思考、分解問題、設計一致的介面,並封裝資料。雖然從長遠來看,學習使用靜態型別語言很重要,但在學生的第一堂程式設計課程中,它不一定是最好的課程主題。

Python 的許多其他面向使它成為一種很好的第一語言。像 Java 一樣,Python 有一個大型的標準函式庫,因此學生可以在課程的早期就被指派程式設計的專案,且這些專案能夠一些事情。指派的內容不會侷限於標準的四功能計算機和平衡檢驗程式。透過使用標準函式庫,學生可以在學習程式設計基礎知識的同時,獲得處理真實應用程式的滿足感。使用標準函式庫還可以教導學生程式碼再使用 (code reuse) 的課題。像是 PyGame 等第三方模組也有助於延伸學生的學習領域。

Python 的互動式直譯器使學生能夠在程式設計時測試語言的功能。他們可以開著一個運行直譯器的視窗,同時在另一個視窗中輸入他們的程式原始碼。如果他們不記得 list(串列)的 method(方法),他們可以像這樣做:

>>> L = []
>>> dir(L) 
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort']
>>> [d for d in dir(L) if '__' not in d]
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> help(L.append)
Help on built-in function append:

append(...)
    L.append(object) -> None -- append object to end

>>> L.append(1)
>>> L
[1]

有了直譯器,當學生正在程式設計時,說明文件永遠都不會遠離他們。

Python 也有很好的 IDE。IDLE 是 Python 的一個跨平臺 IDE,它以 Python 編寫並使用 Tkinter。Emacs 使用者會很高興知道 Emacs 有一個非常好的 Python 模式。這些程式設計環境全部都能提供語法突顯 (syntax highlighting)、自動縮排,以及在編寫程式時存取互動式直譯器。要查看 Python 編輯環境的完整清單,請參閱 Python wiki

如果你想討論 Python 在教育領域中的使用,你可能會有興趣加入 edu-sig 郵件討論群