# 一般的 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」。

See the Developer's Guide for more information about the development cycle, and PEP 387 to learn more about Python's backward compatibility policy. See also the documentation for `sys.version`, `sys.hexversion`, and `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/ 找到。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），這些版本會被用於改善穩定性；在錯誤修正發布版本中，只會包含針對已知問題的修正，並且會保證介面在一系列的錯誤修正發布版本中維持不變。

The latest stable releases can always be found on the Python download page. Python 3.x is the recommended version and supported by most widely used libraries. Python 2.x is not maintained anymore.

### 有多少人在使用 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 郵件討論群。