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

请参阅 Developer's Guide 获取更多有关开发流程的信息，并参阅 **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/ 找到
。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 郵
件討論群。
