Python程序设计语言

**Python**（英國發音：/ˈpaɪθən/；美國發音：/ˈpaɪθɑːn/），是一種廣泛使用的直譯式、進階和通用的程式語言。Python 支援多種程式設計範式，包括結構化、程序式、反射式、物件導向和函式語言程式設計。它擁有動態型別系統和垃圾回收功能，能夠自動管理記憶體使用，並且其本身擁有一個巨大而廣泛的標準庫。它的語言結構以及物件導向的方法，旨在幫助程式設計師為小型的和大型的專案編寫邏輯清晰的程式碼。

吉多・范羅蘇姆於 1980 年代後期開始研發 Python，作為 ABC 語言的後繼者，它也可以被視為採用了叫做 M - 表達式的中綴表示法的一種 LISP 方言。吉多・范羅蘇姆於 1991 年首次釋出 Python 0.9.0。Python 2.0 於 2000 年釋出並引入了新功能。Python 3.0 於 2008 年釋出，它是該語言的主要修訂版，並非完全向下相容。Python 2 於 2020 年隨 2.7.18 版停止支援。

Python 的設計哲學，強調程式碼的可讀性和簡潔的語法，尤其是使用空格縮排來劃分程式碼塊。相比於 C 語言或 Java，Python 讓開發者能夠用更少的代碼表達想法。

Python 直譯器本身幾乎可以在所有的作業系統中執行，它的官方直譯器 CPython 是用 C 語言編寫的。Python 是一個由社群驅動的自由軟體，目前由 Python 軟體基金會管理。Python 是最受歡迎的程式語言之一。

## 歷史

Python 的創始人吉多・范羅蘇姆，在 1982 年至 1995 年間，參與了荷蘭數學和電腦科學研究學會多個專案的工作。1989 年的聖誕節期間，他決心開發一個新的指令碼解釋程式，作為 ABC 語言的繼承者，並且用它替代 Unix shell 和 C 語言來進行系統管理，擔負與 Amoeba 作業系統之間的互動操作並進行例外處理。他是 BBC 電視劇《Monty Python 的飛行馬戲團》的愛好者，所以選取了 Python 作為這個程式語言的名字。范羅蘇姆作為 Python 的主要開發者，獨自擔負這個專案的發展決策者職責，直到 2018 年 7 月 12 日，他宣布從終身仁慈獨裁者（BDFL）的職位上「永久休假」。他在 2019 年 1 月至 11 月參與了第一屆五人掌控委員會繼續領導專案發展。

在 1991 年 2 月，范羅蘇姆在 alt.sources 上釋出了最初程式碼（標記為版本 0.9.0），這時就已經存在了帶繼承的類、例外處理、函式和核心類型 `list`、`dict`、`str` 等。在這個最初發行中就有了從 Modula-3 引進的模組系統，和例外處理機制。在 1994 年 1 月，Python 達到了版本 1.0，其主要新特徵是由 Amrit Prem 提供的函式語言程式設計工具 `lambda`、`map`、`filter` 和 `reduce`。受 Modula-3 啟發，Python 1.1 介入了預設參數值，Python 1.3 介入了關鍵字參數。Python 1.4 介入了對複數的內建支援，還包含了採取名字修飾的一種基本形式的資料隱藏。

在 2000 年 10 月，Python 2.0 發布，它介入了列表推導式，這是從函式語言程式設計語言 Haskell 中引進的；它支援了 Unicode，還向垃圾回收系統增加了環檢測演算法。Python 2.1 支援了靜態巢狀作用域。Python 2.2 進行了重大革新，將 Python 的類型（用 C 語言寫成）和類（用 Python 寫成）統一入一個層級，使得 Python 的物件模型成為純粹而一致的物件模型；還介入了迭代器，受 CLU 和 Icon 啟發的生成器，和描述器協定。Python 2.3 介入了從 Dylan 引進的方法解析次序。Python 2.4 介入了集合類型，和函式修飾器。Python 2.5 介入了 `with` 語句，並在官方實現中介入了抽象語法樹。

在 2008 年 12 月，Python 3.0 發布，它對語言做了較大修訂而不能完全後向相容。Python 3 發行包括了 `2to3` 實用工具，它（至少部份的）自動將 Python 2 程式碼轉換成 Python 3 程式碼。Python 3.4 介入了非同步 I/O 模組。Python 3.5 介入了類型提示，和採用 async/await 語法的協程。Python 3.8 介入了賦值表達式。Python 3.9 介入了內建的泛化別名類型，並在官方實現中介入了新的語法解析器。Python 3.10 介入了結構式模式匹配，和內建的聯合類型。Python 3.11 對官方實現進行了最佳化提速。

Python 2.7 的產品壽命結束日期最初設定為 2015 年，由於大量現存程式碼不能移植到 Python 3，而延期支援至 2020 年。隨著 Python 2 的產品壽命結束，2022 年 3 月 14 日釋出的 macOS 12.3 已經徹底移除了 Python 2。當前只有 Python 3 的穩定版本 3.11 和預覽版本 3.12 正在被完全支援，但仍提供對 3.7、3.8、3.9 和 3.10 版本的安全性修正。

在 2022 年 12 月，活躍的 Python 核心開發者，選舉 Pablo Galindo Salgado、Gregory P. Smith、Emily Morehouse、Brett Cannon 和 Thomas Wouters，為 2023 年度「掌控委員會」的五位成員來領導這個專案。

## 特徵與設計哲學

Python 是多範式程式語言。它完全支援結構化程式和物件導向程式設計，還有很多特徵支援函式語言程式設計和元程式設計比如元物件協定（元類和魔術方法）。通過擴充還可以支援很多範式，包括面向切面程式、契約式設計和邏輯程式。

Python 使用動態型別，在記憶體管理上採用參照計數和環檢測相結合的垃圾回收器。它的特徵還有動態名字解析（後期繫結），即在程式執行期間繫結方法和變數的名字。

Python 對遵循 LISP 傳統的函式語言程式設計提供了有限的支援，它提供了 `map`、`filter` 和 `reduce` 函式；列表推導式、字典、集合和生成器表達式。標準庫中的模組 `functools` 和 `itertools`，實現了從 Haskell 和 Standard ML 借鑑來的函數式工具。

Python 的設計理念是「優雅」、「明確」、「簡單」，它的一些重要準被合稱為「Python 之禪」。在 Python 解釋器內運行 `import this` 可以獲得完整的列表，下面舉出其中首要：

* 優美優於醜陋。明瞭優於隱晦。
* 簡單優於複雜。複雜優於凌亂。
* 扁平優於巢狀。稀疏優於稠密。
* 可讀性很重要。

Python 開發者的方法論是「用一種方法，最好是只有一種方法來做一件事」，顯著不同於以 Perl 語言為代表的「不止一種方法去做一件事」風格。Python 開發者在設計語言時，如果面臨多種選擇，一般會選擇明確沒有或者很少有歧義的語法。

范羅蘇姆認為 ABC 語言非常優美和強大，它沒有取得成功的原因是不開放造成的，故而將 Python 本身設計為可擴充的。Python 並不把所有的特性和功能都整合到語言核心，而是提供了豐富的 API 和工具，以便程式設計師能夠輕鬆地使用 Python、C 語言、Cython 來編寫擴充模組。Python 還可以通過外界函式介面如標準庫中的 ctypes 等，來存取動態連結庫或共享庫中 C 語言相容資料類型，並呼叫其中的函式，從而對用其他語言編寫的程式進行整合和封裝。

Python 開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁，通常不會被合併到 Python 的官方實現 CPython 中。在某些對運行速度要求很高的情況，可以使用 JIT 技術的 Python 實現或擴充。

## 語法和語意

Python 為了讓程式碼具備高度的可閱讀性，在設計時盡量使用了其它語言常用的符號和英文單字。Python 支援使用反斜槓作為行接續符，將多個物理行合成為一個邏輯行。在圓括號、方括號或花括號之中的表達式，可以分裂跨越多於一個物理行而不使用反斜槓，這被稱為「隱式行接續」。注釋開始於並非字串文字一部份的一個井號 `#`，並結束於物理行結尾；注釋標示邏輯行的結束，除非已受制於隱式行接續規則；注釋在語法上被忽略。簡單語句包含在一個單一的邏輯行之內，Python 支援使用分號作為分隔符，將多個簡單語句合併入語法意義上的一行之中。

Python 語法中的複合語句，包含（成組的）其他語句；它們以某種方式影響或控制這些其他語句的執行。Python 的複合語句包含一個或多個子句（clause），子句構成自一個頭部（header）和一個套件（suite）。特定複合語句的子句頭部都在同樣的縮排層級上，每個子句頭部開始於一個唯一標識關鍵字，並結束於一個冒號。套件是這個子句所控制的一組語句，套件有兩種形式，可以是與頭部在同一行上的一個或多個由分號分隔的簡單語句，它們跟隨在這個頭部的冒號之後；或者是在後續諸行上的一個或多個縮排的語句，只有這種套件形式可以包含巢狀的複合語句。

### 縮排

Python 語言遵循越位規則，利用縮排來形成語句套件，即語法意義上的塊。連續諸行的縮排層級，被用來生成語法解析器才能見到的 `INDENT` 和 `DEDENT` 記號，二者的作用相當於 C 語言家族的花括號，或 Pascal 語言家族的關鍵字 `begin` 和 `end`。增加縮排就生成 `INDENT` 記號，減少縮排就生成 `DEDENT` 記號。根據 PEP 8 的規定，使用 4 個空格來表示每級縮排。

tab 字元（從左至右）被替代為 1 至 8 個空格，使得直到 tab 之前的諸字元加上這些替代空格的字元總數，是 8 的倍數（這意圖同於 Unix 所用規則）。前導於第一個非空白字元的空格的總數，確定了這一行的縮排層級。縮排所用諸字元，不能使用反斜槓來拆分成多個物理行；直到第一個反斜槓之前的空白確定縮排層級。如果原始碼檔案混合了 tab 和空格，並且在這種方式下縮排的意義依賴於一個 tab 相當於多少個空格，則這種縮排因不一致性而被報錯並拒絕。

### 關鍵字

Python 有如下 35 個關鍵字；它們不能用作識別碼：

內建常數 `True`、`False` 和 `None` 於 Python 3.0 中成為關鍵字，關鍵字 `nonlocal` 介入於 Python 3.0，關鍵字 `async` 和 `await` 介入於 Python 3.5，並在 Python 3.7 中成為正式關鍵字。

識別碼 `match`、`case` 和萬用字元 `_` 介入於 Python 3.10，它們在與模式匹配語句有關的上下文中，可以在語法上充當關鍵字；但是這種區分只在語法解析器層次進行，並非在詞法分析記號化層次。在 Python 中，只在特定上下文中保留的這種識別碼，叫做「軟關鍵字」。

### 識別碼

識別碼就是名字，在 ASCII 範圍內（U+0001..U+007F），可用於識別碼的字元為：大寫字母 `A` 至 `Z` 和小寫字母 `a` 至 `z`，底線 `_` 以及數字 `0` 至 `9`，但首字不可以用數字。如下命名約定，是為「保留識別碼類」：

* `_spam`（單底線開頭）：弱「內部使用」標識。對於 `from M import *`，將不匯入所有以底線開頭的物件。
* `spam_`（單底線結尾）：為了避免與 python 關鍵字的命名衝突。
* `__spam`（雙底線開頭）：在命名一個類特性的時候，採用名字修飾，比如在類 `SpamEggs` 內，`__spam` 將變成 `_SpamEggs__spam`。
* `__spam__`（雙底線開頭雙底線結尾）：指那些包含在使用者控制的命名空間中的「魔術」方法或特性，比如 `__delattr__`、`__dir__`、`__doc__`、`__getattribute__`、\_\_init\_\_、`__new__`、`__repr__`、`__setattr__`、`__sizeof__` 等。建議永遠不要將這樣的命名方式應用於自己的變數或函式。

在 Python 文獻中經常使用的元語法變數是 spam 和 eggs 而非傳統的 foo 和 bar。

### 語句

Python 的語句包括簡單語句：

* 賦值語句，記號為等號 `=`。賦值語句被用來將名字繫結（含重新繫結）到值，以及用來修改可變物件的特性或專案。Python 還支援增廣賦值語句，將一個二元運算和一個賦值語句合併成一個單一語句，例如 `x += 1`。Python 支援「序列解包」（sequence unpacking）：在等號左側可以是一個表達式列表，其中每個表示式都可求值成能被賦值的東西（變數、可寫特性等）；在等號右側相應的是一個「可迭代」物件，它在被迭代時產生的值的數量，同於左手側可寫表達式的數量；賦值語句對這個物件進行迭代，將產生的每個值分別賦值給左側對應的可賦值者。在等號右側直接包裝出序列解包所要求的元組，就形成了並列賦值，可以同時給多個變數賦值，還可以交換兩個變數的值。
* 表達式語句，用來互動式的計算並寫出一個值，或者用來呼叫一個過程（即返回無含義結果的函式），在 Python 中過程返回值 `None`。
* `global` 語句，是在整個當前程式碼塊中成立的聲明，它意味著隨後列出的識別碼被直譯為全域變數。
* `nonlocal` 語句，導致隨後列出的識別碼，提及在除了全域作用域之外的最近包圍作用域中的先前繫結變數。
* `pass` 語句，充當 NOP，表示此行為空，不執行任何操作。
* `assert` 語句，用於程式調適階段時測試執行條件是否滿足。
* `continue` 語句，越過這次迭代並繼續進行下個專案。
* `break` 語句，從迴圈中跳出。
* `return` 語句，用來從函式返回值。
* `raise` 語句，丟擲一個異常。
* `yield` 語句，使用它從一個生成器中返回一個值。在版本 2.5 之前，資訊只能單向的從生成器傳遞出來。自此版本 2.5，重定義 `yield` 為表達式，通過它的返回值將資訊傳遞進入生成器函式中，從而能夠支援協程功能。自從版本 3.3，提供了 `yield from` 語句，含有這個語句的「委託生成器」將其部份運算委託給另一個「子生成器」，將傳入資訊遞送給它並直接回傳它產生的值。`yield` 語句在語意上等價於加圓括號的 `yield` 表達式。版本 3.4 在非同步 I/O 框架中擴充了基於生成器的協程，這個擴充自從 Python 3.8 已經被棄用。版本 3.6 介入了非同步生成器。
* `import` 語句，匯入一個模組或包，它組合了兩種操作，尋找指名的模組，接著將找到的結果繫結到在局部作用域中的名字。匯入語句有三種形式：`import 模块名字 [as 别名]`，找到一個模組，裝載它，如果有需要的話初始化它；在這個匯入語句出現的作用域的局部命名空間中，定義一個名字或一些名字。`from 模块名字 import 定义1 [as 别名1], 定义2 [as 别名2], ...`，找到、裝載、必需時初始化一個模組；接著在局部命名空間中，增加到找到指名特性的參照。（這二個語句範例中的方括號表示其中內容為可選的。）`from 模块名字 import *`，在匯入語句出現的作用域的局部命名空間中，繫結模組中定義的所有公開的名字。
* `del` 語句，遞迴的進行刪除。

複合語句：

* `if` 語句，當條件成立時執行語句套件。它經常包含 `elif`、`else` 子句。
* `while` 語句，當條件為真時，重複執行語句套件。
* `for` 語句，遍歷列表、字串、字典、集合等迭代器，依次處理迭代器中的每個元素。
* `match` 語句，用於模式匹配。
* `try` 語句，它經常包含 `except`、`else`、`finally` 子句，處理在程式執行中出現的異常情況。Python 支援並廣泛使用例外處理，作為檢測錯誤狀況和程式中其他「異常」事件的方式，並提倡在可能出現錯誤狀況的任何時候都使用異常。習慣上存取一個檔案或資源不在使用之前進行測試，而是先行嘗試使用它，再擷取存取被拒絕引發的異常。
* `with` 語句，把一塊程式碼包裹在一個上下文管理器之內。它允許了資源取得即初始化（RAII）式行為，可替代常見的 `try`/`finally` 慣用法。Python 使用 `with` 語句處理資源，在進入一個作用域的時候呼叫一個函式，而在離開它的時候呼叫另一個函式，例如：在一塊程式碼執行之前取得一個鎖，並且在此後釋放這個鎖；或事先打開一個檔案，並且事後關閉它。
* `class` 語句，是定義類的可執行語句。類的衍化列給出基礎類列表，沒有衍化列的類，預設繼承基礎類 `object`。類的套件接著在新的執行框架（frame）中執行，它使用新建的局部命名空間和原來的全域命名空間。當這個類套件完成執行之時，丟棄它的執行框架並儲存它的局部命名空間。一個類物件接著被建立，其基礎類採用衍化列，其特性字典採用儲存的局部命名空間。類名字接著在原來的局部命名空間中，被繫結到這個類物件。
* `def` 語句，是定義函式和方法的可執行語句。它的執行在當前局部命名空間中，將函式名字繫結到一個函式物件（對函式的可執行程式碼的包裝器）。這個函式物件包含到當前全域命名空間的參照，作為呼叫這個函式時使用的全域命名空間。
* `async def` 語句，用於協程函式定義。`await` 表達式、`async for` 語句和 `async with` 語句，只能用在協程函式的主體中。

模組是包含 Python 定義和語句的一個檔案，這個檔案名字是模組名字附加上字尾 `.py`；在一個模組中，模組的名字（作為字串）可獲得為全域變數 `__name__` 的值。內建 `globals()` 函式，返回實現當前模組命名空間的字典。內建 `dir()` 函式，在無參數時，返回在當前局部作用域內的名字列表；在有一個參數時，嘗試返回這個物件的有效特性的列表。包（package）是可以包含子模組或遞迴的子包的模組。包在技術上是具有 `__path__` 特性的 Python 模組。可以將包視為檔案系統上的目錄，而將模組視為這種目錄中的檔案，但是包和模組不必然源自檔案系統。

Python 程式構造自程式碼塊。程式碼塊是作為一個單元執行的 Python 程式文字。模組、函式主體和類別定義都是塊。互動式鍵入的每個命令都是塊。指令碼檔案和指令碼命令是程式碼塊。`__main__` 是頂層程式碼執行所在的環境。「頂層程式碼」是啟動執行的首個使用者指定 Python 模組。從命令列使用 `-m` 參數，作為頂層指令碼執行的模組（作為模組 `__main__`）也是程式碼塊。此時 `__name__` 變數被設定為 `"__main__"`，在這個模組中可籍此增加直接執行時候執行的程式碼。傳遞給內建函式 `eval()` 和 `exec()` 執行的字串是程式碼塊。

在 Python 中賦值所進行的操作，是將一個名字繫結為到一個分立的動態分配的物件的一個參照。名字是通用的參照持有者，它不關聯於一個固定的資料類型，但是，一個名字在給定時間，總是被繫結到有一個類型的某個物件上，這就是動態型別的特徵。名字的儲存位置不「包含」所指示的值，一個共同的值可以賦值給多個名字，一個名字在任何時候，都可以重新繫結到各種不同類型的物件上，包括字串、過程、具有資料和方法的複雜物件等。

除了在塊中出現的每個賦值語句或匯入語句之外，下列構造也繫結名字：給函式的形式參數、類別定義、函式定義、賦值表達式、在 `for` 語句頭部中和各種 `as` 關鍵字之後的識別碼目標（target），`as` 關鍵字出現在 `import` 語句、`with` 語句、`except` 子句、`except*` 子句和結構式模式匹配的 `as` 模式之中。如果一個名字繫結在一個塊中，它是這個塊的局部變數，除非被聲明為 `nonlocal` 或 `global`。如果一個名字繫結在模組層次，它是全域變數；模組程式碼塊的變數，既是局部的也是全域的。如果一個變數使用在一個程式碼塊中，卻不定義在這裡，它是自由變數。

作用域定義一個名字在一個塊中的可見性。如果一個局部變數被定義在一個塊中，它的作用域包括這個塊。如果這個定義出現在一個函式塊中，作用域擴充到在所界定作用域內包含的任何塊，除非所包含的塊為這個名字介入了不同的繫結。當一個名字在一個程式碼塊之中使用，它採用最近包圍作用域來解析。對一個程式碼塊可見的所有這種作用域的集合，叫做這個這個塊的「環境」。如果一個名字繫結在一個塊中，並且在其中於繫結之前就被使用，會導致一個錯誤。

如果 `global` 語句出現在一個塊之中，在這個語句中指定的所有名字，提及在頂層命名空間中這些名字的繫結。名字在頂層命名空間解析，首先尋找全域命名空間，即包含這個程式碼塊的模組的命名空間；未果尋找內建命名空間，即模組 `builtins` 的命名空間。`global` 語句與在同一個塊中的名字繫結運算有同樣的作用域。如果一個自由變數的最近包圍作用域包含它的一個 `global` 語句，這個自由變數被當作全域的。`nonlocal` 語句導致相應的名字，提及在最近包圍函式作用域內的先前繫結變數（即非局部變數）。

### 表達式

Python 中很多表達式與 C 語言和 java 類似，而另一些則與之不同。

* 在 Python 中，算術運算的加法 `+`、減法 `-`、乘法 `*` 和取模 `%` 是與 C 語言和 java 相同的，但是除法的行為不同。在 Python 中有兩種除法，它們是下取整除法（或整數除法）`//` 和浮點除法 `/`。Python 增加了指數算符 `**`。自從 Python 3.5，介入了矩陣乘法算符 `@`，它已經用於了 NumPy 庫。
* 在 Python 中，有如下必須用於整數的位運算：`&` 與（AND），`|` 或（OR），`~` 非（NOT），`^` 互斥或（XOR），`>>` 右移， `<<` 左移。
* 在 Python 中，有如下比較運算：大於 `>`，小於 `<`，等於 `==`，不等於 `!=`，小於等於 `<=`，大於等於 `>=`。`==` 按值比較。Python 的 `is`、`is not` 算符可以用來比較物件的同一性（按參照比較），也就是比較兩個變數是否參照了同一個物件。而 `in`、`not in` 用於判斷一個物件是否屬於另外一個物件。在 Python 中，比較是可以連結起來的，比如 `a < b < c`。
* Python 使用 `and`、`or`、`not` 表示邏輯運算與、或、非，不採用 C 語言和 Java 中所用的符號 `&&`、`||`、`!`。
* 在 Python 中，由逗號 `,` 分隔的一組表達式，叫做表達式列表。Python 為構造列表、字典或集合，提供了叫做「顯示」的特殊語法，它們每個都有兩種方式：包容內容要麼顯式的列出；要麼通過一組迴圈和過濾指令計算而來，這叫做「推導式」。列表顯示是包圍在方括號中的可以為空的一系列表達式，一個例子列表可寫為 `[1,2,3]`。字典顯示是包圍在花括號中的可能為空的一系列的鍵 / 資料項對。集合顯示用花括號來指示，與字典顯示的區別是缺少分隔鍵與值的分號。自從 Python 3.5，增加了在表達式列表中的「可迭代解包」`*`，和在字典顯示中的「字典解包」`**`。
* Python 支援列表推導式。Python 2.4 將列表推導式擴充至更一般性的生成器表達式。Python 3.0 又增補了字典推導式和集合推導式。
* 在 Python 中，加圓括號形式（parenthesized form），是包圍在圓括號中的一個可選表達式列表。加圓括號的表達式列表產生的東西，就是這個表達式列表所產生的：如果這個列表包含至少一個逗號，它產生一個元組；否則它產生構成這個表達式列表的那個單一表達式。一個例子元組可寫為 `(1,2,3)`。元組不是圓括號形成的，而是使用逗號形成的，在沒有歧義的情況下，元組的圓括號是可選的。空的圓括號對產生空元組物件。使用序列串接算符 `+` 來串接二個元組，產生包含給定元組二者的元素的一個新元組。
* Python 支援在序列物件（比如字串、元組或列表）上的下標（subscription）表達式：`a[索引]`，和分片表達式：`a[开始:停止]` 或 `a[开始:停止:步长]`。下標索引是基於零的，負數是相對於結尾的。分片範圍自從「開始」索引，直到但不包括「停止」索引。分片的第三個參數叫做「步長」（step）或「間隔」（stride），允許元素被跳過和用負數指示反向。分片索引可以省略，例如 `a[:]`，這返回整個列表的一個複本。分片的每個元素都是淺層複製的。
* Python 的條件表達式表示為 `x if c else y`。意思是當 `c` 為真時，表達式的值為 `x`，否則表達式的值為 `y`。 在運算數的次序上不同於很多其他語言中常見的 `c ? x : y`。
* Python 的匿名函式實現為 `lambda` 表達式。匿名函式體只能是一個表達式。
* 自從 Python 3.8，介入了賦值表達式，其記號是 `:=`。它將一個表達式賦值給一個識別碼，同時還返回這個表達式的值。賦值表達式在用作子表達式，即位於分片表達式、條件表達式、`lambda` 表達式、關鍵字參數中的表達式和推導式中的 `if` 表達式之中，以及在 `assert` 和 `with` 語句之中的時候，必須圍繞著圓括號。在它們可以使用的所有其他地方，包括在 `if` 和 `while` 語句之中，都不要求圓括號。

Python 中運算子具有優先級，下表中的運算子按照從最高到最低的次序列出。在相同儲存格中運算子具有相同的優先級，它們從左至右結合，除了指數表達式和條件表達式從右至左結合之外：

Python 提供了序列串接算符 `+` 和序列倍增算符 `*`。自從 Python 3.9，介入了字典合併算符 `|` 和字典更新算符 `|=`。

Python 的文字序列類型，包括字串 `str` 和位元組序列 `bytes` 與 `bytearray`。字串文字有多種寫法，字串物件有一個內建格式算符 `%`：

* 短字串文字，由單引號 `'` 或雙引號 `"` 界定。不同於 Unix shell、Perl 和受 Perl 影響的語言，單引號和雙引號功能相同。這二種字串都使用反斜槓 `\` 作為跳脫字元。
* 長字串文字，是開始並結束於三個單引號 `'''` 或三個雙引號 `"""` 的序列。它們可以跨越多行，其功能就像 shell、Perl 和 Ruby 中的 here 文件。
* 位元組文字總是字首上一個 `b` 或 `B`，它產生 `bytes` 類型的實例。它們只可以包含 ASCII 字元，具有 128 或更大數值的位元組必須通過跳脫來表達。
* 字串文字或位元組文字都可選的能字首上一個 `r` 或 `R`，這叫做原始字串。跳脫序列不被直譯，因此在文字反斜槓常見的地方很有用，比如正規表示式和 Windows 風格的路徑。這種引述可比較於 C# 中的「`@` 引述」。
* Python 允許多個毗鄰的字串文字或位元組文字（它們以空白分界並可以使用不同的引述約定），在編譯時間於語法層面上串接起來。要在執行時間串接字串，必須使用序列串接算符 `+`。
* Python 中的「字串格式」算符 `%`，在功能上類同於 C 語言中的 `printf` 格式化字串，例如 `"spam=%s eggs=%04d" % ("blah", 2)`，求值為 `'spam=blah eggs=0002'`。自從 Python 3.0，`str` 類提供了可供替代的 `format()` 方法，例如 `"spam={0} eggs={1:04d}".format("blah", 2)`。在 Python 3.6 中，提供了「格式化字串文字」或稱為「f 字串」，它向字串文字字首上 `f` 或 `F`，這是一種字串插值，例如 `x = "blah"; y = 2; f'spam={x} eggs={y:04d}'`。

在 Python 中，在表達式和語句之間的區別是嚴格強制性的，這對比於語言如 Common Lisp、Scheme 或 Ruby。故而 Python 中個別構造存在功能重複，比如：列表推導式相當 `for` 迴圈；條件表達式相當 `if` 語句；內建函式 `eval()` 相當 `exec()`，前者用於表達式，後者用於語句。

語句不能成為表達式的一部份，由於列表和其他推導式或 lambda 表達式，都是表達式，也就不能包含語句。這個限制的一個範例：賦值語句比如 `a = 1`，不能用作條件語句的條件判斷表達式的一部份；這能夠避免 C 語言程式中的一個常見錯誤，即在條件判斷時把等於算符 `==` 誤寫為賦值算符 `=`，這不是預期程式碼卻在語法上有效而能通過編譯器檢查，在 Python 中這會導致一個語法錯誤。

### 函式

Python 的函式支援遞迴和閉包
，及其他頭等函式特徵，但不支援函式多載。Python 的函式作為頭等物件，具有和普通物件平等的地位。Python 官方實現不提供尾呼叫最佳化或頭等續體，吉多・范羅蘇姆曾聲稱永遠都不會加以支援，目前只有第三方庫支援。

Python 可以在函式定義時，於形式參數序列中，指定形式參數的預設值，即以 `param=value` 樣式進行一次性初始化。形式參數在初始化之後，保持既有繫結；函式的後續呼叫，可繼續對它進行存取或變更。為有預設值的形式參數提供實際參數，在函式呼叫時是可選的。

Python 的函式實際參數與形式參數之間的結合，是傳遞「物件參照」，函式在被呼叫的時候，給函式呼叫的實際參數，被介入到一個局部符號表中，實際參數使用傳值呼叫來傳遞，而這個值總是物件參照，而非這個物件的值。如果形式參數繫結到一個可變的物件，則通過形式參數對此物件內容的修改，在函式外也是可見的。如果形式參數繫結到一個不可變的物件，則通過形式參數是不能修改此物件內容，但可以把形式參數重新繫結到其它物件上，這並不影響函式外的物件的值。

Python 支援位置實際參數和關鍵字實際參數。函式呼叫時，實際參數可以如同 C 語言那樣，按照位置與形式參數匹配；也可以採用命名參數或稱為關鍵字實際參數，即 `kwarg=value` 樣式的實際參數。使用不對應實際參數的特殊形式參數 `/` 和 `*`，可以將參數序列分為三部份：唯位置參數、可位置可關鍵字參數和唯關鍵字參數。有預設值的形式參數之後，不能跟隨無預設值的可位置形式參數。在一個函式呼叫的實際參數序列中，關鍵字實際參數必須出現在位置實際參數之後。

在位置和關鍵字形式參數序列末尾，可以分別有 `*args` 或 `**kwargs` 這樣的形式參數，它們對應於在函式呼叫時提供的，超出形式參數序列規定而無所對應的多個實際參數；在形式參數名字前加一個 `*` 號，該形式參數 `args` 是 `tuple` 類型，對應可變數目的位置實際參數；在形式參數名字前加 `**` 號，該形式參數 `kwargs` 是 `dict` 類型，對應可變數目的關鍵字實際參數。如果位置實際參數已經在一個序列類型如列表或元組的物件中，在參照它的變數前加一個 `*` 號傳遞給函式，則其中所有元素解包為多個位置實際參數；如果關鍵字實際參數在字典中，則加 `**` 號來傳遞給函式。

修飾器（decorator）可用來修改一個函式、方法或類別定義的任何可呼叫 Python 物件。將已定義的原來物件傳遞給修飾器，它返回一個修改後的物件，接著把它繫結到在定義中那個名字。Python 修飾器部份受到 Java 註解的影響，而有類似的語法；修飾器語法是純粹的語法糖，使用 `@` 作為關鍵字形成修飾詞。修飾器是一種形式的元程式設計，它們增強它們所修飾的函式或方法的行動。
多個修飾器可以連結起來，通過在毗連的行上放置多個修飾詞，或者使用中間變數。
函式修飾器的正規用法包括：用來建立類別方法或靜態方法、設定先決條件和後置條件、實現多方法、增加函式特性、跟蹤、同步；此外更遠大的用法包括：尾呼叫消除、記憶化。

為了增強程式碼的可讀性，可以在函式後書寫「文件字串」（簡稱 docstrings），用於直譯函式的作用、參數的類型與意義、返回值類型與取值範圍等。可以使用內建函式 `help()`，列印出函式的使用幫助。自從 Python 3.0，函式可以對參數與返回值增加類型標註。此特性可方便對原始碼進行更深入的分析。自從 Python 3.5，開始支援類型提示。

### 物件及其方法

Python 支援大多數物件導向程式設計技術。在 Python 中所有東西都是物件，包括類、函式、數和模組。它允許多型性，不只是在類層級之內，而且通過採用鴨子型別的方式。任何物件可以用於任何類型，只要它有適當的方法和特性（attribute）就能工作。Python 天然支援類的繼承包括多重繼承，為此採用 C3 線性化或方法解析次序（MRO）演算法，還支援混入。Python 支援元類，自從 Python 3.6，提供了客製化類建立的簡單機制。

Python 使用名字修飾，有限的支援私有變數。物件的（可寫）特性可以被提取為一個字典。在 Python 中，不強制使用存取子與變異子方法，來存取資料成員的物件導向程式設計信條。就像 Python 提供函式語言程式設計構造，但不嘗試要求參照透明性（無副作用）一樣，它提供物件系統，但不要求物件導向程式設計行為。

物件的方法，是附屬於這個物件的類的函式。對於正常的方法和函式，語法 `instance.method(arguments)`，是 `Class.method(instance, arguments)` 的語法糖。Python 的方法有顯式的 `self` 形式參數，用來存取實例資料；這借鑑自 Modula-3，對立於隱式的 `self` 或 `this` 關鍵字，它們用在其他一些物件導向程式設計語言，比如 C++、Java、Objective-C 或 Ruby 之中。在 Python 中，`self` 可以被看作是一個習慣用法，它可以被換為任何其它合法的參數名。

Python 提供了 `super()` 內建函式，當一個子類的方法覆蓋了超類方法的時候，可通過呼叫 `super().method`，來呼叫與子類的 `self.method` 方法同名超類別方法。
Python 支援一些以 `__` 開始和結束的特殊方法名，它們用於實現運算子多載，以及實現多種特殊功能。在 Python 中，可以通過定義特殊方法來多載運算子，比如在一個類上定義 `__add__()`，將允許在這個類別的實例上使用 `+` 算符。

在 Python 中，定義了一個或多個特殊方法 `__get__()`、`__set__()`、`__delete__()` 的類，可以用作描述器（descriptor）。建立一個描述器的實例，作為另一個類的一個類別成員，使得這個實例成為此另一個類的屬性（property）。使用與特性（attribute）存取相同的語法，存取一個實例物件中的這個成員屬性。

Python 允許通過使用 `@classmethod` 和 `@staticmethod` 修飾詞，來分別建立類別方法和靜態方法。給類別方法的第一個實際參數，是對類物件的參照，而非對實例的 `self` 參照。靜態方法沒有特定的第一個實際參數，實例或類物件，都不固定的傳遞給靜態方法。
Python 的 `property` 內建函式，將一個類中特殊定義的存取一個特性的那些方法，包裝成的這個類的一個屬性。

### 類型

Python 使用鴨子型別，並擁有有類型的物件，和無類型的變數名字。在編譯期不檢查類型約束，而寧願在一個物件上的操作出現可能的失敗，表現出這個給定物件不具有適合的類型。儘管是動態型別系統，Python 卻是強型別的，禁止沒有明確定義的操作（比如加一個數到一個字串），而不是默默的去嘗試轉換使其有意義。Python 支援廣泛的類型和類的內省。類型是 `type` 的實例，可以被讀取和比較。

Python 有著範圍廣泛的基本資料類型。同時具備常規的整數和浮點算術，它透明的支援任意精度算術、複數和十進位浮點數。Python 支援種類繁多的字串操作。在 Python 中，字串是不可變的，所以在其他程式語言中可能就地改變字串的字串操作，比如字元替換，在 Python 中返回新的字串。

Python 有一個非常有用特徵，就是搜集（或稱容器）類型的概念。一般的說，搜集是以一種易於參照或索引的方式，包含其他物件的物件。搜集有二種基本形式：序列和對映。Python 對建立容器類型的物件有著語法上的支援。Python 還提供了廣泛的搜集操縱能力，比如內建的包含元素檢查和通用迭代協定。

有次序的序列類型是列表（動態陣列）、元組和字串。所有序列類型都是位置索引的（從 `0` 到 `长度−1`），並且除了字串，都可以包含任意類型的物件，在同一個序列中包括多種類型的物件。字串和元組是不可變的，使得它們成為字典的鍵的完美候選者。在另一方面，列表是可變的，元素可以被插入、刪除、修改、添加或就地排序。

在另一方面，對映是以「字典」形式實現的無次序的類型，它將一組不可變的鍵，對映到相應的元素上（非常像數學函式）。在字典中的鍵，必須是不可變的 Python 類型，比如整數或字串，因為在底層它們是通過雜湊函式實現的。字典還是語言內部的中心，因為它們居於所有 Python 物件和類的核心：在變數名字（字串）和這個名字所參照的值之間的對映，就儲存為字典，而這些字典可以通過物件的 `__dict__` 特性直接存取。

集合搜集類型，在版本 2.4 中被增加入語言核心。集合是無索引、無次序的搜集，它包含唯一性的不可變物件作為元素，並且實現了集合論運算，比如併集 `|`、交集 `&`、相對補集 `-`、對稱差 `^`，和子集測試 `<=`、真子集測試 `<`、超集測試 `>=`、真超集測試 `>`。有二種類型的集合：可變的 `set` 和不可變的 `frozenset`。

Python 允許程式者使用類，定義自己的類型，類是在物件導向程式設計中最經常使用的。類的新實例，是通過呼叫這個類的構造器而建立的，而類都是元類 `type` 的實例，`type` 是 `type` 元類自身的實例，這允許了元程式設計和反射。

在版本 3.0 之前，Python 有兩種類：舊式的和新式的。二種樣式的語法是一樣的，不同在於是否直接或間接的繼承自類 `object`，所有新式類都從 `object` 繼承，並且是 `type` 的實例。在 Python 2 系列 2.2 以上，二種類都可以使用。在 Python 3.0 中淘汰了舊式類。

長期規劃是支援漸進類型，並且自從 Python 3.5，語言的語法允許指定靜態型別，但在預設實現 CPython 中不檢查它們。有叫做「mypy」的可選的靜態型別檢查器，支援編譯期型別檢查。

除了各種資料類型，Python 直譯器還內建了很多其他類型，包括可呼叫類型：使用者定義函式、實例方法、生成器函式、協程函式、非同步生成器函式、內建函式、內建方法、類、類別方法；模組，客製化類，類別實例，I/O 物件（也叫做檔案物件），和暴露給使用者的一些內部類型：程式碼物件、框架物件、溯回物件、切片物件、靜態方法物件、類別方法物件。

### 數學

Python 的算術運算，使用平常的符號 `+`、`-`、`*`、`/` 和模除 `%`（這裡的餘數可以是負數，比如 `4 % -3 == -2`）。它還有下取整除法算符 `//`，指數算符 `**`，比如 `5**3 == 125` 及 `9**0.5 == 3.0`，和矩陣乘法算符 `@`。這些算符就像在傳統數學中一樣運算，具有同樣的優先級規則，中綴算符 `+`、`-`，還可以分別表示取原數和取相反數的一元算符。

在整數之間的除法 `/`，產生浮點數結果。除法 `/` 的表現，隨著版本不同而有著顯著變化。
Python 提供了 `round()` 內建函式，用於把一個浮點數修約成最近的整數。

Python 允許由比較運算連結起來的布林表達式，表現得如在數學中常用的一樣。比如表達式 `a < b < c`，測試 `a < b and b < c`。C 語言將它解析為 `(a < b) < c`：即首先求值 `a < b`，其結果為 `0` 或 `1`，接著把這個結果比較於 `c`。

Python 對所有整數運算，使用任意精度算術。在 `decimal` 模組中的 `Decimal` 類，提供十進位浮點數，具有使用者可按需要而更改的預設 28 個十進位有效數位精度，並有多種修約方式。在 `fractions` 模組中的 `Fraction` 類，提供任意精度的有理數。

由於 Python 有著廣泛的數學庫，除了求絕對值函式 `abs()` 列入內建函式之外，大多數數學函式，處於 `math` 和 `cmath` 模組內。前者用於實數運算，而後者用於複數運算。特別是第三方庫 NumPy，進一步擴充了原生能力，Python 經常被用作科學手稿語言，來處理如數值資料處理和操縱等問題。

## 標準庫

Python 擁有一個強大的標準庫。Python 標準庫包括了如下功能：

## 程式碼實例

一個在標準輸出裝置上輸出 Hello World 的簡單程式，這種程式通常作為開始學習程式語言時的第一個程式，可將如下程式碼錄入純文字檔案並隨意命名比如 `program01.py`，然後執行這個程式 `python3 program01.py`：

Python 也可以單步直譯執行。執行 Python 直譯器進入互動式命令列的環境，你可以在提示符號 `>>>` 旁輸入 `print("Hello, world!")`，按 Enter 鍵輸出結果：

計算正數的階乘的程式碼：

注意，在 Python 3.0 及以上版本中，`print` 是個函式，需要在要列印的字串前後加上圓括號；在 Python 2.6 以下版本中，`print` 是一個關鍵字和命令而不加圓括號。

## 實現

Python 是一門跨平台的手稿語言，Python 規定了一個 Python 語法規則，根據該規則可編寫 Python 直譯器。Python 屬於動態語言，將 Python 程式編譯成中間形式的位元組碼，並接著在它的虛擬機器上執行，相較於 C/C++ 和 java 的等編譯語言而言執行速度較慢。

**活躍開發的實現**

**到其他語言的交叉編譯器**

仍在維護中的舊版本實現有：Stackless Python，它是實現微執行緒的 CPython 3.8 分叉；IronPython，它是面向.NET 和 Ecma CLI 的 Python 2.7 和 Python 3.4 實現；Jython，它是用 Java 實現的 Python 2.7。

## 開發環境

### 通用文字編輯器

很多並非整合式開發環境軟體的文字編輯器，也對 Python 有不同程度的支援，並且加上專門為 Python 設計的編輯器外掛程式也會有很高的可用性。

### 專用開發環境

適用於 Python 的整合式開發環境（IDE）軟體，除了標準二進位釋出包所附的 IDLE 之外，還有許多其他選擇。其中有些軟體設計有語法著色、語法檢查、執行偵錯、自動補全、智慧型感知等便利功能。由於 Python 的跨平台出身，這些軟體往往也具備各種作業系統的版本或一定的移植性。

## 應用

在很多作業系統裡，Python 是標準的系統元件。大多數 Linux 發行版和 macOS 都整合了 Python，可以在終端機下直接執行 Python。雖然 Python 可被粗略地分類為手稿語言，Python 的支持者較喜歡稱它為一種高階動態語言，常像「膠水」一樣被用來連接軟體組件，已經顯著的區別於 Unix shell、Windows PowerShell 這樣的語言。基於 Python 的 xonsh，是跨平台的、青睞 Unix 的 shell 語言和命令列介面。

Python 社群提供了大量的功能覆蓋眾多領域的第三方模組，其使用方式與標準庫類似。第三方模組可以使用 Python/Cython 或者 C 語言編寫。軟體工具 SWIG 和 SIP，通過定義介面檔案或規定檔案的方式，可以將 C/C++ 編寫的程式庫包裝為 Python 模組。Python 直譯器本身也可以被整合到其它需要手稿語言的程式內。

pip 是事實標準和官網推薦的用 Python 書寫的軟體套件管理系統，它通常連接到叫做 Python 包索引的一個公開軟體套件線上倉庫。pipenv 自動為使用者專案建立和管理虛擬環境，還在安裝 / 卸裝軟體套件的時候，向 Pipfile 檔案增加 / 移除這個軟體套件。pyenv 可以安裝並輕易切換多個版本的 Python。

自從 2003 年，Python 始終排行於 TIOBE 程式社群索引前十最流行程式語言，在 2021 年 10 月它首次達到了第一名最流行語言（居於 C 和 Java 之前），並被選為 2007 年、2010 年、2018 年、2020 年和 2021 年的年度程式語言。

### 網路服務

Python 定義了 WSGI 標準應用介面，來協調 Http 伺服器與基於 Python 的 Web 程式之間的溝通。比如，通過 mod\_wsgi 模組，Apache 可以運行用 Python 編寫的 Web 程式。Zope 是著名的用 Python 編寫的開源的 Web 應用伺服器。Tornado 是用 Python 語言寫成的非阻塞式 web 伺服器，也是輕量級的 Web 框架。

Python 對於各種網路協定的支援很完善，因此適用於編寫伺服器軟體、網路爬蟲等 Web 開發。用 Python 編寫的一些 Web 框架，有助於輕鬆地開發和管理複雜的 Web 程式。著名的第三方 Web 框架和函式庫：

### 圖形化使用者介面

Python 本身包含了 Tkinter 庫，它是 Python 的業界標準 GUI 並被整合進入了 IDLE。Tkinter 基於了 Tcl 命令工具，能夠支援簡單的 GUI 開發。但是為了讓所開發的軟體執行速度更快，並與使用者的桌面環境更契合，人們一般會選擇採用第三方 GUI 庫或框架。著名的第三方 GUI 庫：

### 資料科學

重要的資料科學用第三方軟體庫有：

重要的人工智慧機器學習框架有：

### 其它種類的庫

### 應用軟體

一些 Linux 發行版，使用 Python 語言編寫安裝器，比如 Ubuntu 的 Ubiquity 和 Fedora 的 Anaconda；或使用它編寫軟體包管理系統，比如 Gentoo 的 Portage。一些著名的網際網路公司在內部使用 Python。一些遊戲比如 EVE，使用 Python 編寫遊戲的邏輯、伺服器。如下著名應用使用 Python 編寫或將它作為嵌入式指令碼：

### 社群流行

## 影響的語言

Python 的設計和哲學已經影響了很多其他程式語言：

Ruby 的建立者松本行弘曾說過：「我想要一種手稿語言，比 Perl 更加強力而且比 Python 更加物件導向，因此我決定設計自己的語言」。Julia 設計原則中有一條是：「像 Python 一樣可用於通用程式」。

## 程式碼範例

## 註釋

## 延伸閱讀

## 參閲

## 外部連接