# 一般的 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 時有任何版權限制嗎？

你可以對原始碼做任何你想做的事情，只要你保留版權，並且在你製作的任何關於 Python 的說明文件中顯示這些版權即可。如果你遵守版權規則，就可以將 Python 用於商業用途，以原始碼或二進制形式（修改或未修改）銷售 Python 的複本，或者以某種形式銷售內含 Python 的產品。當然，我們仍然會想要知道所有的 Python 商業用途。

請參閱 授權頁面，查詢更深入的說明和 PSF 授權全文的連結。

Python 標誌是註冊商標，在某些情況下需要許可才能使用它。請參閱商標使用政策以取得更多資訊。

### 當初為什麼 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」。

請參閱開發人員指南以獲得更多關於開發週期的資訊，並參閱 PEP 387 以瞭解更多關於 Python 的向後相容性政策。另外，也請查看 `sys.version`、`sys.hexversion` 和 `sys.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/ 找到。EPUB、純文字和可下載的 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 3.x 是推薦的版本，並且被大多數廣泛使用的函式庫所支援。Python 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 郵件討論群。