術語表

>>>

互動式 shell 的預設 Python 提示符。常用於可在直譯器中互動執行的程式碼示例。

...

可以指

  • 當輸入縮排程式碼塊的程式碼時,或者當在一對匹配的左右分隔符(圓括號、方括號、花括號或三引號)內時,或者在指定裝飾器之後,互動式 shell 的預設 Python 提示符。

抽象基類

抽象基類透過提供一種定義介面的方法來補充鴨子型別,而當其他技術(如hasattr())笨拙或存在細微錯誤(例如使用魔法方法)時。ABCs 引入了虛擬子類,這些類不繼承自某個類,但仍然被isinstance()issubclass()識別;請參閱abc模組文件。Python 附帶了許多用於資料結構(在collections.abc模組中)、數字(在numbers模組中)、流(在io模組中)、匯入查詢器和載入器(在importlib.abc模組中)的內建 ABC。您可以使用abc模組建立自己的 ABC。

註解函式

一個可以被呼叫以檢索物件註解的函式。此函式可以透過函式、類和模組的__annotate__屬性訪問。註解函式是求值函式的一個子集。

註解

與變數、類屬性或函式引數或返回值相關聯的標籤,根據約定用作型別提示

區域性變數的註解在執行時無法訪問,但全域性變數、類屬性和函式的註解可以透過分別在模組、類和函式上呼叫annotationlib.get_annotations()來檢索。

請參閱變數註解函式註解PEP 484PEP 526PEP 649,它們描述了此功能。另請參閱註解最佳實踐以瞭解使用註解的最佳實踐。

實參

呼叫函式(或方法)時傳遞給函式(或方法)的值。實參有兩種

  • 關鍵字實參:在函式呼叫中以識別符號(例如name=)開頭的實參,或者作為字典中以**開頭的字典值傳遞的實參。例如,在以下對complex()的呼叫中,35都是關鍵字實參

    complex(real=3, imag=5)
    complex(**{'real': 3, 'imag': 5})
    
  • 位置實參:不是關鍵字實參的實參。位置實參可以出現在實參列表的開頭,和/或作為以*開頭的可迭代物件的元素傳遞。例如,在以下呼叫中,35都是位置實參

    complex(3, 5)
    complex(*(3, 5))
    

實參被賦給函式體中命名的區域性變數。有關此賦值規則,請參閱呼叫部分。從語法上講,任何表示式都可以用來表示實參;求值後的值被賦給區域性變數。

另請參閱形參詞彙表條目、FAQ 中關於實參和形參之間區別的問題,以及PEP 362

非同步上下文管理器

一個透過定義__aenter__()__aexit__()方法來控制async with語句中環境的物件。由PEP 492引入。

非同步生成器

返回非同步生成器迭代器的函式。它看起來像使用async def定義的協程函式,但它包含yield表示式,用於生成可在async for迴圈中使用的系列值。

通常指非同步生成器函式,但在某些上下文中也可能指_非同步生成器迭代器_。在預期含義不明確的情況下,使用完整的術語可以避免歧義。

非同步生成器函式可能包含await表示式以及async forasync with語句。

非同步生成器迭代器

非同步生成器函式建立的物件。

這是一個非同步迭代器,當使用__anext__()方法呼叫時,它會返回一個可等待物件,該物件將執行非同步生成器函式的主體,直到下一個yield表示式。

每個yield會暫時暫停處理,記住執行狀態(包括區域性變數和待處理的try語句)。當_非同步生成器迭代器_透過__anext__()返回的另一個可等待物件有效恢復時,它會從上次中斷的地方繼續。參見PEP 492PEP 525

非同步可迭代物件

一個可以在async for語句中使用的物件。必須從其__aiter__()方法返回一個非同步迭代器。由PEP 492引入。

非同步迭代器

一個實現了__aiter__()__anext__()方法的物件。__anext__()必須返回一個可等待物件。async for會解析非同步迭代器__anext__()方法返回的可等待物件,直到它引發StopAsyncIteration異常。由PEP 492引入。

附加執行緒狀態

當前作業系統執行緒活動的執行緒狀態

當一個執行緒狀態被附加時,作業系統執行緒可以訪問完整的 Python C API 並可以安全地呼叫位元組碼直譯器。

除非函式明確註明,否則在沒有附加執行緒狀態的情況下嘗試呼叫 C API 將導致致命錯誤或未定義行為。執行緒狀態可以透過 C API 由使用者顯式附加和分離,或由執行時隱式附加,包括在阻塞 C 呼叫期間和位元組碼直譯器在呼叫之間。

在大多數 Python 構建中,擁有附加執行緒狀態意味著呼叫者持有當前直譯器的 GIL,因此在給定時刻只有一個作業系統執行緒可以擁有附加執行緒狀態。在 自由執行緒 Python 構建中,執行緒可以併發持有附加執行緒狀態,從而實現位元組碼直譯器的真正並行化。

屬性

與物件關聯的值,通常使用點表示式按名稱引用。例如,如果物件 o 有一個屬性 a,它將被引用為 o.a

如果物件允許,可以使用setattr()等方法給物件一個名稱不是名稱(識別符號和關鍵字)定義的識別符號的屬性。這樣的屬性不能透過點表示式訪問,而需要使用getattr()來檢索。

可等待物件

一個可以在await表示式中使用的物件。它可以是協程或具有__await__()方法的物件。另請參閱PEP 492

BDFL

終身仁慈獨裁者(Benevolent Dictator For Life),即 Python 的建立者Guido van Rossum

二進位制檔案

能夠讀寫位元組類物件檔案物件。二進位制檔案的示例包括以二進位制模式('rb''wb''rb+')開啟的檔案、sys.stdin.buffersys.stdout.buffer以及io.BytesIOgzip.GzipFile的例項。

另請參閱文字檔案,瞭解能夠讀寫str物件的檔案物件。

借用引用

在 Python 的 C API 中,借用引用是對一個物件的引用,使用該程式碼的物件不擁有該引用。如果該物件被銷燬,它就變成了懸空指標。例如,垃圾回收可以移除對該物件的最後一個強引用,從而銷燬它。

建議在借用引用上呼叫Py_INCREF()以將其原地轉換為強引用,除非在借用引用最後一次使用之前物件無法被銷燬。Py_NewRef()函式可用於建立新的強引用

位元組類物件

支援緩衝協議並能匯出 C-連續緩衝區的物件。這包括所有bytesbytearrayarray.array物件,以及許多常見的memoryview物件。位元組類物件可用於處理二進位制資料的各種操作;這些操作包括壓縮、儲存到二進位制檔案和透過套接字傳送。

某些操作需要二進位制資料是可變的。文件通常將其稱為“讀寫位元組類物件”。可變緩衝區物件的示例包括bytearraybytearraymemoryview。其他操作要求二進位制資料儲存在不可變物件中(“只讀位元組類物件”);這些示例包括bytesbytes物件的memoryview

位元組碼

Python 原始碼被編譯成位元組碼,這是 CPython 直譯器中 Python 程式的內部表示。位元組碼也快取到.pyc檔案中,這樣第二次執行同一檔案會更快(可以避免從原始碼重新編譯到位元組碼)。這種“中間語言”據說執行在一個虛擬機器上,該虛擬機器執行與每個位元組碼對應的機器程式碼。請注意,位元組碼不期望在不同的 Python 虛擬機器之間工作,也不期望在 Python 版本之間保持穩定。

位元組碼指令列表可在dis 模組的文件中找到。

可呼叫物件

一個可以被呼叫的物件,可能帶有一組實參(參見實參),其語法如下:

callable(argument1, argument2, argumentN)

函式,以及方法,是可呼叫物件。實現了__call__()方法的類的例項也是可呼叫物件。

回撥函式

作為引數傳遞,在未來某個時間點執行的子例程函式。

用於建立使用者定義物件的模板。類定義通常包含對類例項進行操作的方法定義。

類變數

在類中定義的變數,只打算在類級別修改(即不在類的例項中修改)。

閉包變數

巢狀作用域引用的自由變數,它定義在外部作用域中,而不是在執行時從全域性或內建名稱空間解析。可以使用nonlocal關鍵字顯式定義以允許寫入訪問,或者如果變數僅被讀取則隱式定義。

例如,在以下程式碼中的inner函式中,xprint都是自由變數,但只有x是_閉包變數_

def outer():
    x = 0
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner

由於codeobject.co_freevars屬性(儘管其名稱,它只包含閉包變數的名稱,而不是列出所有引用的自由變數),更通用的自由變數術語有時也被使用,即使其預期含義是特指閉包變數。

複數

實數系統的擴充套件,其中所有數字都表示為實部和虛部之和。虛數是虛數單位(-1的平方根)的實數倍,在數學中通常寫作i,在工程中寫作j。Python 內建支援複數,使用後一種表示法書寫;虛部以j字尾書寫,例如3+1j。要訪問math模組的複數等效項,請使用cmath。使用複數是一個相當高階的數學特性。如果您不知道需要它們,那麼幾乎可以肯定可以安全地忽略它們。

上下文

這個術語根據其使用地點和方式有不同的含義。一些常見含義:

上下文管理協議

with語句呼叫的__enter__()__exit__()方法。參見PEP 343

上下文管理器

一個實現上下文管理協議並控制with語句中環境的物件。參見PEP 343

上下文變數

其值取決於哪個上下文是當前上下文的變數。值透過contextvars.ContextVar物件訪問。上下文變數主要用於隔離併發非同步任務之間的狀態。

連續

如果緩衝區是_C-連續_或_Fortran連續_,則它被認為是連續的。零維緩衝區是 C 和 Fortran 連續的。在一維陣列中,元素必須在記憶體中相鄰排列,按索引從零開始遞增的順序。在多維 C-連續陣列中,訪問元素時,最後一個索引變化最快。然而,在 Fortran 連續陣列中,第一個索引變化最快。

協程

協程是子例程的更通用形式。子例程在一個點進入,在另一個點退出。協程可以在許多不同點進入、退出和恢復。它們可以使用async def語句實現。另請參見PEP 492

協程函式

一個返回協程物件的函式。協程函式可以使用async def語句定義,並可能包含awaitasync forasync with關鍵字。這些由PEP 492引入。

CPython

Python 程式語言的規範實現,在python.org上分發。當需要區分此實現與其他實現(例如 Jython 或 IronPython)時,使用術語“CPython”。

當前上下文

上下文contextvars.Context物件),當前被ContextVar物件用於訪問(獲取或設定)上下文變數的值。每個執行緒都有自己的當前上下文。用於執行非同步任務的框架(參見asyncio)將每個任務與一個上下文關聯起來,當任務開始或恢復執行時,該上下文就成為當前上下文。

迴圈隔離

一個或多個物件的子組,它們之間相互引用形成引用迴圈,但不受組外物件的引用。迴圈垃圾收集器的目標是識別這些組並打破引用迴圈,以便回收記憶體。

裝飾器

一個返回另一個函式的函式,通常使用@wrapper語法作為函式轉換應用。裝飾器的常見示例是classmethod()staticmethod()

裝飾器語法僅僅是語法糖,以下兩個函式定義在語義上是等價的

def f(arg):
    ...
f = staticmethod(f)

@staticmethod
def f(arg):
    ...

類也存在相同的概念,但在類中不那麼常用。有關裝飾器的更多資訊,請參閱函式定義類定義的文件。

描述器

任何定義了__get__()__set__()__delete__()方法的物件。當類屬性是描述器時,在屬性查詢時會觸發其特殊的繫結行為。通常,使用 a.b 來獲取、設定或刪除屬性時,會在 a 的類字典中查詢名為 b 的物件,但如果 b 是描述器,則會呼叫相應的描述器方法。理解描述器是深入理解 Python 的關鍵,因為它們是許多特性的基礎,包括函式、方法、屬性、類方法、靜態方法以及對超類的引用。

有關描述器方法的更多資訊,請參閱實現描述器描述器操作指南

字典

一種關聯陣列,其中任意鍵對映到值。鍵可以是任何具有__hash__()__eq__()方法的物件。在 Perl 中稱為雜湊。

字典推導式

一種緊湊的方式,用於處理可迭代物件中的全部或部分元素並返回一個帶有結果的字典。results = {n: n ** 2 for n in range(10)}生成一個字典,其中鍵n對映到值n ** 2。請參閱列表、集合和字典的顯示

字典檢視

dict.keys()dict.values()dict.items()返回的物件稱為字典檢視。它們提供字典條目的動態檢視,這意味著當字典更改時,檢視會反映這些更改。要強制字典檢視成為一個完整的列表,請使用list(dictview)。參見字典檢視物件

文件字串

作為類、函式或模組中第一個表示式出現的字串字面量。雖然在套件執行時被忽略,但它被編譯器識別並放入封閉類、函式或模組的__doc__屬性中。由於它可以透過內省獲得,因此它是物件文件的規範位置。

鴨子型別

一種程式設計風格,它不檢視物件的型別來確定它是否具有正確的介面;相反,方法或屬性只是被呼叫或使用(“如果它看起來像鴨子,叫起來像鴨子,那它一定是鴨子。”)透過強調介面而不是特定型別,精心設計的程式碼透過允許多型替換來提高其靈活性。鴨子型別避免使用type()isinstance()進行測試。(但請注意,鴨子型別可以與抽象基類互補。)相反,它通常採用hasattr()測試或EAFP程式設計。

雙下劃線

“double underscore”的非正式簡稱,用於談論特殊方法時。例如,__init__通常讀作“dunder init”。

EAFP

“請求寬恕比請求許可更容易”。這種常見的 Python 編碼風格假設存在有效的鍵或屬性,並在假設被證明錯誤時捕獲異常。這種簡潔快速的風格的特點是存在許多tryexcept語句。該技術與許多其他語言(例如 C)中常見的LBYL風格形成對比。

求值函式

可以呼叫以評估物件惰性求值屬性的函式,例如使用type語句建立的類型別名的值。

表示式

一種可以被求值為某個值的語法片段。換句話說,表示式是文字、名稱、屬性訪問、運算子或函式呼叫等表示式元素的累積,它們都返回一個值。與許多其他語言不同,並非所有語言構造都是表示式。還有一些語句不能用作表示式,例如while。賦值也是語句,而不是表示式。

擴充套件模組

用 C 或 C++ 編寫的模組,使用 Python 的 C API 與核心和使用者程式碼互動。

f-字串
f-字串

fF為字首的字串字面量通常稱為“f-字串”,它是格式化字串字面量的簡稱。另請參閱PEP 498

檔案物件

一個向底層資源公開檔案導向 API(具有諸如read()write()等方法)的物件。根據其建立方式,檔案物件可以調解對磁碟上的真實檔案或對其他型別的儲存或通訊裝置(例如標準輸入/輸出、記憶體緩衝區、套接字、管道等)的訪問。檔案物件也稱為檔案類物件

實際上有三類檔案物件:原始二進位制檔案、帶緩衝的二進位制檔案文字檔案。它們的介面在io模組中定義。建立檔案物件的規範方法是使用open()函式。

檔案類物件

檔案物件的同義詞。

檔案系統編碼和錯誤處理程式

Python 用於解碼來自作業系統的位元組和編碼 Unicode 到作業系統的編碼和錯誤處理程式。

檔案系統編碼必須保證能成功解碼所有小於 128 的位元組。如果檔案系統編碼不能提供此保證,API 函式可能會引發UnicodeError

可以使用sys.getfilesystemencoding()sys.getfilesystemencodeerrors()函式來獲取檔案系統編碼和錯誤處理程式。

檔案系統編碼和錯誤處理程式在 Python 啟動時由PyConfig_Read()函式配置:參見filesystem_encodingfilesystem_errors成員,它們是PyConfig的成員。

另請參閱區域設定編碼

查詢器

試圖查詢正在匯入的模組的載入器的物件。

查詢器有兩種型別:用於sys.meta_path元路徑查詢器,以及用於sys.path_hooks路徑入口查詢器

有關更多詳細資訊,請參閱查詢器和載入器以及importlib

整除

數學除法,向下取整到最接近的整數。整除運算子是//。例如,表示式11 // 4的值是2,與浮點數真除法返回的2.75不同。請注意,(-11) // 4-3,因為它是-2.75向下取整。參見PEP 238

自由執行緒

一種執行緒模型,允許多個執行緒在同一個直譯器內同時執行 Python 位元組碼。這與全域性直譯器鎖形成對比,全域性直譯器鎖只允許一個執行緒一次執行 Python 位元組碼。參見PEP 703

自由變數

正式地,正如語言執行模型中所定義,自由變數是名稱空間中未作為區域性變數使用的任何變數。有關示例,請參閱閉包變數。實際上,由於codeobject.co_freevars屬性的名稱,該術語有時也用作閉包變數的同義詞。

函式

一系列語句,向呼叫者返回某個值。它也可以傳遞零個或多個實參,這些實參可以在函式體執行中使用。另請參閱形參方法以及函式定義部分。

函式註解

函式引數或返回值的註解

函式註解通常用於型別提示:例如,這個函式預計接受兩個int引數,並且預計有一個int返回值

def sum_two_numbers(a: int, b: int) -> int:
   return a + b

函式註解語法在函式定義一節中解釋。

請參閱變數註解PEP 484,它們描述了此功能。另請參閱註解最佳實踐以瞭解使用註解的最佳實踐。

__future__

一個未來語句from __future__ import <feature>,指示編譯器使用未來 Python 版本中將成為標準的語法或語義編譯當前模組。__future__模組記錄了_feature_可能的值。透過匯入此模組並評估其變數,您可以檢視新功能何時首次新增到語言中,以及它何時將(或已經)成為預設值

>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
垃圾回收

當記憶體不再使用時釋放記憶體的過程。Python 透過引用計數和能夠檢測並打破引用迴圈的迴圈垃圾回收器執行垃圾回收。垃圾回收器可以透過gc模組進行控制。

生成器

返回生成器迭代器的函式。它看起來像一個普通函式,但包含yield表示式,用於生成一系列值,這些值可在for迴圈中使用,或使用next()函式一次獲取一個。

通常指生成器函式,但在某些上下文中也可能指_生成器迭代器_。在預期含義不明確的情況下,使用完整的術語可以避免歧義。

生成器迭代器

生成器函式建立的物件。

每個yield會暫時暫停處理,記住執行狀態(包括區域性變數和待處理的try語句)。當_生成器迭代器_恢復時,它會從上次中斷的地方繼續(與每次呼叫都重新開始的函式不同)。

生成器表示式

一個返回迭代器表示式。它看起來像一個普通表示式,後跟一個定義迴圈變數、範圍和可選if子句的for子句。組合表示式為封閉函式生成值

>>> sum(i*i for i in range(10))         # sum of squares 0, 1, 4, ... 81
285
泛型函式

由多個函式組成的函式,為不同的型別實現相同的操作。在呼叫期間使用哪個實現由排程演算法決定。

另請參閱單分派詞彙表條目、functools.singledispatch()裝飾器和PEP 443

泛型型別

可以引數化的型別;通常是容器類,例如listdict。用於型別提示註解

有關更多詳細資訊,請參閱泛型別名型別PEP 483PEP 484PEP 585typing模組。

GIL

參見全域性直譯器鎖

全域性直譯器鎖

CPython直譯器使用的機制,以確保一次只有一個執行緒執行 Python 位元組碼。這透過使物件模型(包括關鍵的內建型別如dict)隱式地免受併發訪問的危害,從而簡化了 CPython 的實現。鎖定整個直譯器使得直譯器更容易支援多執行緒,但代價是多處理器機器所提供的並行性大打折扣。

然而,一些標準或第三方擴充套件模組設計為在執行計算密集型任務(如壓縮或雜湊)時釋放 GIL。此外,在進行 I/O 時,GIL 總是會被釋放。

自 Python 3.13 起,可以使用--disable-gil構建配置停用 GIL。使用此選項構建 Python 後,必須使用-X gil=0或在設定PYTHON_GIL=0環境變數後執行程式碼。此功能可提高多執行緒應用程式的效能,並更容易高效地使用多核 CPU。有關更多詳細資訊,請參閱PEP 703

在 Python C API 的早期版本中,函式可能會宣告它需要持有 GIL 才能使用它。這指的是具有附加執行緒狀態

基於雜湊的 pyc

一個位元組碼快取檔案,它使用對應原始檔的雜湊值而不是最後修改時間來確定其有效性。請參閱快取位元組碼的失效

可雜湊 (hashable)

如果一個物件在其生命週期內雜湊值永不改變(它需要一個 __hash__() 方法),並且可以與其他物件進行比較(它需要一個 __eq__() 方法),則稱其為 可雜湊的。比較結果相等的雜湊物件必須具有相同的雜湊值。

可雜湊性使得物件可以作為字典的鍵和集合的成員,因為這些資料結構在內部使用雜湊值。

大多數 Python 的不可變內建物件都是可雜湊的;可變容器(如列表或字典)不可雜湊;不可變容器(如元組和凍結集合)僅在其元素可雜湊時才可雜湊。使用者自定義類的例項預設是可雜湊的。它們都比較不相等(除了與自身比較),並且它們的雜湊值派生自它們的 id()

IDLE

一個用於 Python 的整合開發和學習環境。IDLE — Python 編輯器和 shell 是一個基本的編輯器和直譯器環境,隨 Python 的標準分發版一起提供。

不朽的 (immortal)

不朽物件PEP 683 中引入的 CPython 實現細節。

如果一個物件是不朽的,它的 引用計數 永遠不會被修改,因此在直譯器執行期間它永遠不會被釋放。例如,TrueNone 在 CPython 中是不朽的。

不朽物件可以透過 sys._is_immortal() 或 C API 中的 PyUnstable_IsImmortal() 來識別。

不可變 (immutable)

值固定的物件。不可變物件包括數字、字串和元組。此類物件不能被更改。如果需要儲存不同的值,則必須建立一個新物件。它們在需要常量雜湊值的地方發揮重要作用,例如作為字典中的鍵。

匯入路徑 (import path)

基於路徑的查詢器 搜尋以匯入模組的位置列表(或路徑條目)。在匯入期間,此位置列表通常來自 sys.path,但對於子包,它也可能來自父包的 __path__ 屬性。

匯入 (importing)

一個模組中的 Python 程式碼對另一個模組中的 Python 程式碼可用的過程。

匯入器 (importer)

一個既能查詢又能載入模組的物件;一個 查詢器載入器 物件。

互動式 (interactive)

Python 有一個互動式直譯器,這意味著你可以在直譯器提示符下輸入語句和表示式,立即執行它們並檢視其結果。只需不帶任何引數啟動 python(可能透過從計算機主選單中選擇它)。這是一種非常強大的方式來測試新想法或檢查模組和包(記住 help(x))。有關互動模式的更多資訊,請參閱 互動模式

解釋型 (interpreted)

Python 是一種解釋型語言,而不是編譯型語言,儘管由於存在位元組碼編譯器,這種區別可能模糊不清。這意味著原始檔可以直接執行,而無需顯式建立然後執行可執行檔案。解釋型語言通常比編譯型語言具有更短的開發/調試周期,儘管它們的程式通常也執行得更慢。另請參閱 互動式

直譯器關閉 (interpreter shutdown)

當被要求關閉時,Python 直譯器進入一個特殊階段,它逐漸釋放所有已分配的資源,例如模組和各種關鍵內部結構。它還會多次呼叫 垃圾回收器。這可能會觸發使用者定義解構函式或弱引用回撥中的程式碼執行。在關閉階段執行的程式碼可能會遇到各種異常,因為其所依賴的資源可能不再起作用(常見示例是庫模組或警告機制)。

直譯器關閉的主要原因是 __main__ 模組或正在執行的指令碼已完成執行。

可迭代的 (iterable)

能夠一次返回其成員一個的物件。可迭代物件的示例包括所有序列型別(例如 liststrtuple)以及某些非序列型別,如 dict檔案物件 以及你用 __iter__() 方法或實現 序列 語義的 __getitem__() 方法定義的任何類的物件。

可迭代物件可以在 for 迴圈和許多其他需要序列的地方使用(zip()map() 等)。當可迭代物件作為引數傳遞給內建函式 iter() 時,它會為該物件返回一個迭代器。此迭代器適用於對值集的一次遍歷。使用可迭代物件時,通常不需要自己呼叫 iter() 或處理迭代器物件。for 語句會自動為你完成此操作,建立一個臨時無名變數來在迴圈期間儲存迭代器。另請參閱 迭代器序列生成器

迭代器 (iterator)

表示資料流的物件。重複呼叫迭代器的 __next__() 方法(或將其傳遞給內建函式 next())會返回流中的連續項。當沒有更多資料可用時,會引發 StopIteration 異常。此時,迭代器物件已耗盡,後續任何對其 __next__() 方法的呼叫都只會再次引發 StopIteration。迭代器必須有一個 __iter__() 方法,該方法返回迭代器物件本身,因此每個迭代器也是可迭代的,並且可以在接受其他可迭代物件的大多數地方使用。一個值得注意的例外是嘗試多次迭代的程式碼。容器物件(如 list)每次將其傳遞給 iter() 函式或在 for 迴圈中使用時,都會生成一個新的迭代器。對迭代器執行此操作只會返回在先前迭代中使用的同一個已耗盡的迭代器物件,使其看起來像一個空容器。

更多資訊可在 迭代器型別 中找到。

CPython 實現細節: CPython 不會始終如一地應用迭代器必須定義 __iter__() 的要求。另請注意,自由執行緒 CPython 不保證迭代器操作的執行緒安全。

鍵函式 (key function)

鍵函式或排序函式是返回用於排序或順序的值的可呼叫物件。例如,locale.strxfrm() 用於生成一個瞭解特定區域設定排序約定的排序鍵。

Python 中的許多工具接受鍵函式來控制元素的排序或分組方式。它們包括 min()max()sorted()list.sort()heapq.merge()heapq.nsmallest()heapq.nlargest()itertools.groupby()

有幾種建立鍵函式的方法。例如,str.lower() 方法可以作為不區分大小寫排序的鍵函式。或者,鍵函式可以由 lambda 表示式構建,例如 lambda r: (r[0], r[2])。此外,operator.attrgetter()operator.itemgetter()operator.methodcaller() 是三個鍵函式構造器。有關如何建立和使用鍵函式的示例,請參閱 排序指南

關鍵字引數 (keyword argument)

請參閱 引數

lambda

一個匿名的行內函數,由一個在函式呼叫時求值的單個 表示式 組成。建立 lambda 函式的語法是 lambda [引數]: 表示式

LBYL

先看後跳 (Look Before You Leap)。這種編碼風格在進行呼叫或查詢之前顯式測試前置條件。這種風格與 EAFP 方法形成對比,其特點是存在許多 if 語句。

在多執行緒環境中,LBYL 方法可能會在“檢視”和“跳躍”之間引入競爭條件。例如,程式碼 if key in mapping: return mapping[key] 可能會失敗,如果另一個執行緒在測試之後但在查詢之前從 mapping 中刪除了 key。這個問題可以透過鎖或使用 EAFP 方法來解決。

詞法分析器 (lexical analyzer)

tokenizer 的正式名稱;參見 令牌

列表 (list)

一個內建的 Python 序列。儘管其名稱如此,但它更像其他語言中的陣列,而不是連結串列,因為對元素的訪問是 O(1)。

列表推導式 (list comprehension)

一種緊湊的方式,用於處理序列中的全部或部分元素,並返回一個包含結果的列表。result = ['{:#04x}'.format(x) for x in range(256) if x % 2 == 0] 生成一個字串列表,其中包含 0 到 255 範圍內偶數的十六進位制數 (0x..)。if 子句是可選的。如果省略,則處理 range(256) 中的所有元素。

載入器 (loader)

載入模組的物件。它必須定義 exec_module()create_module() 方法以實現 Loader 介面。載入器通常由 查詢器 返回。另請參閱

區域編碼 (locale encoding)

在 Unix 上,它是 LC_CTYPE 區域設定的編碼。它可以透過 locale.setlocale(locale.LC_CTYPE, new_locale) 設定。

在 Windows 上,它是 ANSI 內碼表(例如:"cp1252")。

在 Android 和 VxWorks 上,Python 使用 "utf-8" 作為區域編碼。

locale.getencoding() 可用於獲取區域編碼。

另請參閱 檔案系統編碼和錯誤處理程式

魔法方法 (magic method)

特殊方法 的非正式同義詞。

對映 (mapping)

支援任意鍵查詢並實現 collections.abc.Mappingcollections.abc.MutableMapping 抽象基類 中指定方法的容器物件。示例包括 dictcollections.defaultdictcollections.OrderedDictcollections.Counter

元路徑查詢器 (meta path finder)

透過搜尋 sys.meta_path 返回的 查詢器。元路徑查詢器與 路徑條目查詢器 相關,但有所不同。

有關元路徑查詢器實現的方法,請參閱 importlib.abc.MetaPathFinder

元類 (metaclass)

類的類。類定義建立一個類名、一個類字典和一個基類列表。元類負責接收這三個引數並建立類。大多數面向物件程式語言提供預設實現。Python 的特殊之處在於可以建立自定義元類。大多數使用者不需要此工具,但當需要時,元類可以提供強大而優雅的解決方案。它們已被用於記錄屬性訪問、新增執行緒安全、跟蹤物件建立、實現單例以及許多其他任務。

更多資訊可在 元類 中找到。

方法 (method)

在類體內定義的函式。如果作為該類例項的屬性呼叫,該方法將把例項物件作為其第一個 引數(通常稱為 self)。請參閱 函式巢狀作用域

方法解析順序 (method resolution order)

方法解析順序是查詢成員時搜尋基類的順序。有關 Python 直譯器自 2.3 版本以來使用的演算法的詳細資訊,請參閱 Python 2.3 方法解析順序

模組 (module)

作為 Python 程式碼組織單元的物件。模組有一個包含任意 Python 物件的名稱空間。模組透過 匯入 過程載入到 Python 中。

另請參閱

模組規範 (module spec)

一個包含用於載入模組的匯入相關資訊的名稱空間。importlib.machinery.ModuleSpec 的一個例項。

另請參閱 模組規範

MRO

請參閱 方法解析順序

可變 (mutable)

可變物件可以改變其值,但保持其 id() 不變。另請參閱 不可變

命名元組 (named tuple)

“命名元組”一詞適用於任何繼承自元組且其可索引元素也可以透過命名屬性訪問的型別或類。該型別或類可能還具有其他功能。

有幾個內建型別是命名元組,包括 time.localtime()os.stat() 返回的值。另一個例子是 sys.float_info

>>> sys.float_info[1]                   # indexed access
1024
>>> sys.float_info.max_exp              # named field access
1024
>>> isinstance(sys.float_info, tuple)   # kind of tuple
True

某些命名元組是內建型別(如上述示例)。另外,命名元組可以從繼承自 tuple 並定義命名欄位的常規類定義建立。此類可以手工編寫,也可以透過繼承 typing.NamedTuple 或使用工廠函式 collections.namedtuple() 建立。後兩種技術還添加了一些可能在手寫或內建命名元組中找不到的額外方法。

名稱空間 (namespace)

儲存變數的位置。名稱空間以字典的形式實現。有區域性、全域性和內建名稱空間,以及物件中的巢狀名稱空間(在方法中)。名稱空間透過防止命名衝突來支援模組化。例如,函式 builtins.openos.open() 透過它們的名稱空間進行區分。名稱空間還透過明確哪個模組實現某個函式來幫助提高可讀性和可維護性。例如,編寫 random.seed()itertools.islice() 清晰地表明這些函式分別由 randomitertools 模組實現。

名稱空間包 (namespace package)

一個僅用作子包容器的 。名稱空間包可能沒有物理表示,並且特別與 常規包 不同,因為它們沒有 __init__.py 檔案。

名稱空間包允許多個獨立安裝的包擁有一個共同的父包。否則,建議使用 常規包

欲瞭解更多資訊,請參閱 PEP 420名稱空間包

另請參閱 模組

巢狀作用域 (nested scope)

引用封閉定義中變數的能力。例如,在另一個函式中定義的函式可以引用外部函式中的變數。請注意,預設情況下,巢狀作用域僅適用於引用,不適用於賦值。區域性變數在最內層作用域中讀寫。同樣,全域性變數在全域性名稱空間中讀寫。nonlocal 允許寫入外部作用域。

新式類 (new-style class)

現在用於所有類物件的類風格的舊名稱。在早期 Python 版本中,只有新式類才能使用 Python 的更新、多功能特性,如 __slots__、描述符、屬性、__getattribute__()、類方法和靜態方法。

物件 (object)

任何具有狀態(屬性或值)和定義行為(方法)的資料。也是任何 新式類 的最終基類。

最佳化作用域 (optimized scope)

當代碼編譯時,目標區域性變數名可靠地為編譯器所知的範圍,從而允許最佳化對這些名稱的讀寫訪問。函式、生成器、協程、推導式和生成器表示式的區域性名稱空間都以這種方式進行最佳化。注意:大多數直譯器最佳化都應用於所有範圍,只有那些依賴於已知區域性和非區域性變數名集的最佳化才限於最佳化範圍。

包 (package)

一個可以包含子模組或遞迴地包含子包的 Python 模組。從技術上講,包是一個帶有 __path__ 屬性的 Python 模組。

另請參閱 常規包名稱空間包

引數 (parameter)

函式(或方法)定義中指定函式可以接受的 引數(或在某些情況下是多個引數)的命名實體。引數有五種型別

  • 位置或關鍵字:指定可以按位置或作為關鍵字引數傳遞的引數。這是預設的引數型別,例如以下程式碼中的 foobar

    def func(foo, bar=None): ...
    
  • 僅位置:指定只能透過位置提供的引數。僅位置引數可以透過在函式定義的引數列表中的它們後面包含一個 / 字元來定義,例如以下程式碼中的 posonly1posonly2

    def func(posonly1, posonly2, /, positional_or_keyword): ...
    
  • 僅關鍵字:指定只能透過關鍵字提供的引數。僅關鍵字引數可以透過在函式定義的引數列表中的它們前面包含一個單獨的變長位置引數或裸 * 來定義,例如以下程式碼中的 kw_only1kw_only2

    def func(arg, *, kw_only1, kw_only2): ...
    
  • 變長位置:指定可以提供任意序列的位置引數(除了其他引數已經接受的任何位置引數)。此類引數可以透過在引數名稱前加上 * 來定義,例如以下程式碼中的 args

    def func(*args, **kwargs): ...
    
  • 變長關鍵字:指定可以提供任意數量的關鍵字引數(除了其他引數已經接受的任何關鍵字引數)。此類引數可以透過在引數名稱前加上 ** 來定義,例如上面示例中的 kwargs

引數可以指定可選引數和必需引數,以及某些可選引數的預設值。

另請參閱 argument 術語表條目,關於 引數與形參的區別 的常見問題,inspect.Parameter 類,函式定義 部分,以及 PEP 362

路徑條目 (path entry)

匯入路徑 上的單個位置,基於路徑的查詢器 會查詢該位置以查詢要匯入的模組。

路徑條目查詢器 (path entry finder)

sys.path_hooks 上的可呼叫物件(即 路徑條目鉤子)返回的 查詢器,它知道如何根據給定的 路徑條目 定位模組。

有關路徑條目查詢器實現的方法,請參閱 importlib.abc.PathEntryFinder

路徑條目鉤子 (path entry hook)

sys.path_hooks 列表上的一個可呼叫物件,如果它知道如何在特定的 路徑條目 上查詢模組,則返回一個 路徑條目查詢器

基於路徑的查詢器 (path based finder)

預設的 元路徑查詢器 之一,它搜尋 匯入路徑 以查詢模組。

類路徑物件 (path-like object)

表示檔案系統路徑的物件。類路徑物件可以是表示路徑的 strbytes 物件,也可以是實現 os.PathLike 協議的物件。支援 os.PathLike 協議的物件可以透過呼叫 os.fspath() 函式轉換為 strbytes 檔案系統路徑;os.fsdecode()os.fsencode() 可分別用於保證 strbytes 結果。由 PEP 519 引入。

PEP

Python 增強提案。PEP 是一份設計文件,旨在向 Python 社群提供資訊,或描述 Python 或其流程或環境的新特性。PEP 應提供簡潔的技術規範和對提議特性的基本原理。

PEP 旨在作為提出主要新特性、收集社群對某個問題的意見以及記錄 Python 設計決策的主要機制。PEP 作者負責在社群內建立共識並記錄不同意見。

請參閱 PEP 1

部分 (portion)

單個目錄(可能儲存在zip檔案中)中的一組檔案,它們按照PEP 420中的定義,構成一個名稱空間包。

位置引數 (positional argument)

請參閱 引數

臨時 API (provisional API)

臨時 API 是指已被特意排除在標準庫向後相容性保證之外的 API。雖然預計此類介面不會發生重大更改,但只要它們被標記為臨時,如果核心開發人員認為有必要,可能會發生向後不相容的更改(包括但不限於刪除介面)。此類更改不會無故進行——只有在發現 API 包含之前遺漏的嚴重根本缺陷時才會發生。

即使對於臨時 API,向後不相容的更改也被視為“最後的解決方案”——仍將盡一切努力尋找與已識別的任何問題向後相容的解決方案。

這個過程允許標準庫隨著時間的推移不斷發展,而不會將有問題的設計錯誤鎖定很長時間。有關更多詳細資訊,請參閱 PEP 411

臨時包 (provisional package)

請參閱 臨時 API

Python 3000

Python 3.x 釋出系列的暱稱(很久以前,當版本 3 的釋出還是遙遠的未來時,就創造了這個詞。)這也被縮寫為“Py3k”。

Pythonic

一種思想或一段程式碼,它緊密遵循 Python 語言最常見的慣用法,而不是使用其他語言常見的概念來實現程式碼。例如,Python 中一種常見的慣用法是使用 for 語句遍歷可迭代物件的所有元素。許多其他語言沒有這種構造,因此不熟悉 Python 的人有時會使用數字計數器

for i in range(len(food)):
    print(food[i])

與更簡潔的 Pythonic 方法相反

for piece in food:
    print(piece)
合格名稱 (qualified name)

一個帶點的名稱,顯示從模組的全域性作用域到該模組中定義的類、函式或方法的“路徑”,如 PEP 3155 中定義。對於頂級函式和類,合格名稱與物件的名稱相同

>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.__qualname__
'C'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__qualname__
'C.D.meth'

當用於指代模組時,完全合格名稱 意味著模組的整個點分路徑,包括任何父包,例如 email.mime.text

>>> import email.mime.text
>>> email.mime.text.__name__
'email.mime.text'
引用計數 (reference count)

一個物件的引用數量。當一個物件的引用計數降為零時,它將被釋放。某些物件是 不朽的,其引用計數永不修改,因此這些物件永遠不會被釋放。引用計數通常對 Python 程式碼不可見,但它是 CPython 實現的關鍵元素。程式設計師可以呼叫 sys.getrefcount() 函式來返回特定物件的引用計數。

CPython 中,引用計數不被認為是穩定或明確的值;一個物件的引用數量以及該數量如何受 Python 程式碼影響,在不同版本之間可能會有所不同。

常規包 (regular package)

傳統的 ,例如包含 __init__.py 檔案的目錄。

另請參閱 名稱空間包

REPL

“read–eval–print loop”的首字母縮寫,是 互動式 直譯器 shell 的另一個名稱。

__slots__

類內部的宣告,透過預先宣告例項屬性的空間並消除例項字典來節省記憶體。儘管很流行,但這種技術有點難以正確使用,最好保留在記憶體關鍵型應用程式中存在大量例項的罕見情況下。

序列 (sequence)

一種 可迭代物件,它透過 __getitem__() 特殊方法支援使用整數索引高效訪問元素,並定義一個 __len__() 方法來返回序列的長度。一些內建序列型別包括 liststrtuplebytes。請注意,dict 也支援 __getitem__()__len__(),但它被視為對映而不是序列,因為查詢使用任意 可雜湊 鍵而不是整數。

collections.abc.Sequence 抽象基類定義了一個更豐富的介面,它不僅僅是 __getitem__()__len__(),還添加了 count()index()__contains__()__reversed__()。實現此擴充套件介面的型別可以使用 register() 顯式註冊。有關序列方法的一般文件,請參閱 常見的序列操作

集合推導式 (set comprehension)

一種緊湊的方式,用於處理可迭代物件中的全部或部分元素,並返回一個包含結果的集合。results = {c for c in 'abracadabra' if c not in 'abc'} 生成字串集合 {'r', 'd'}。請參閱 列表、集合和字典的顯示

單分派 (single dispatch)

通用函式 分派的一種形式,其中實現是根據單個引數的型別選擇的。

切片 (slice)

一個通常包含 序列 一部分的 物件。切片使用下標表示法 [] 建立,當給出多個數字時,它們之間用冒號分隔,例如 variable_name[1:3:5]。方括號(下標)表示法在內部使用 slice 物件。

軟廢棄 (soft deprecated)

軟廢棄的 API 不應在新程式碼中使用,但對於現有程式碼使用它是安全的。該 API 仍然有文件和測試,但不會進一步增強。

軟廢棄與普通廢棄不同,不計劃移除 API,也不會發出警告。

請參閱 PEP 387: Soft Deprecation

特殊方法 (special method)

由 Python 隱式呼叫的方法,用於在型別上執行特定操作,例如加法。此類方法的名稱以雙下劃線開頭和結尾。特殊方法在 特殊方法名 中有文件說明。

標準庫 (standard library)

作為官方 Python 直譯器包的一部分分發的 模組擴充套件模組 的集合。該集合的確切成員可能因平臺、可用系統庫或其他標準而異。文件可在 Python 標準庫 中找到。

另請參閱 sys.stdlib_module_names 以獲取所有可能的標準庫模組名稱列表。

語句 (statement)

語句是套件(程式碼的“塊”)的一部分。語句要麼是 表示式,要麼是帶關鍵字的幾種構造之一,例如 ifwhilefor

靜態型別檢查器 (static type checker)

一個外部工具,用於讀取 Python 程式碼並對其進行分析,尋找不正確的型別等問題。另請參閱 型別提示typing 模組。

stdlib

標準庫 的縮寫。

強引用 (strong reference)

在 Python 的 C API 中,強引用是對一個物件的引用,該引用由持有該引用的程式碼所有。當引用建立時,透過呼叫 Py_INCREF() 來獲取強引用,並在引用刪除時透過 Py_DECREF() 釋放。

Py_NewRef() 函式可用於建立一個物件的強引用。通常,在退出強引用作用域之前,必須對強引用呼叫 Py_DECREF() 函式,以避免洩漏一個引用。

另請參閱 借用引用

t-字串 (t-string)
t-字串 (t-strings)

tT 為字首的字串字面量通常被稱為“t-字串”,它是 模板字串字面量 的縮寫。

文字編碼 (text encoding)

Python 中的字串是 Unicode 碼點序列(範圍 U+0000U+10FFFF)。為了儲存或傳輸字串,需要將其序列化為位元組序列。

將字串序列化為位元組序列稱為“編碼”,從位元組序列重新建立字串稱為“解碼”。

有各種不同的文字序列化 編解碼器,它們統稱為“文字編碼”。

文字檔案 (text file)

能夠讀寫 str 物件的 檔案物件。通常,文字檔案實際上訪問的是面向位元組的資料流,並自動處理 文字編碼。文字檔案的示例包括以文字模式開啟的檔案('r''w')、sys.stdinsys.stdoutio.StringIO 的例項。

另請參閱 二進位制檔案,它是一種能夠讀寫 類位元組物件 的檔案物件。

執行緒狀態 (thread state)

CPython 執行時用於在作業系統執行緒中執行的資訊。例如,這包括當前的異常(如果有)和位元組碼直譯器的狀態。

每個執行緒狀態繫結到單個作業系統執行緒,但執行緒可能擁有許多可用的執行緒狀態。最多隻有一個可以同時處於 附加狀態

呼叫大多數 Python C API 需要一個 附加執行緒狀態,除非函式明確另有說明。位元組碼直譯器僅在附加執行緒狀態下執行。

每個執行緒狀態屬於一個直譯器,但每個直譯器可能擁有許多執行緒狀態,包括同一個作業系統執行緒的多個執行緒狀態。來自多個直譯器的執行緒狀態可以繫結到同一個執行緒,但任何給定時刻只能有一個處於 附加狀態

有關更多資訊,請參閱 執行緒狀態和全域性直譯器鎖

令牌 (token)

詞法分析器(也稱為 分詞器)生成的原始碼的小單元。名稱、數字、字串、運算子、換行符等都由令牌表示。

tokenize 模組公開了 Python 的詞法分析器。token 模組包含有關各種令牌型別的資訊。

三引號字串 (triple-quoted string)

由三個引號 (") 或三個撇號 (') 包圍的字串。雖然它們不提供任何單引號字串無法提供的功能,但它們在許多方面都很有用。它們允許你在字串中包含未經轉義的單引號和雙引號,並且它們可以跨越多行而無需使用續行符,這使得它們在編寫文件字串時特別有用。

型別 (type)

Python 物件的型別決定了它是什麼型別的物件;每個物件都有一個型別。物件的型別可以透過其 __class__ 屬性訪問,也可以透過 type(obj) 檢索。

類型別名 (type alias)

型別的同義詞,透過將型別賦給識別符號建立。

類型別名對於簡化 型別提示 很有用。例如

def remove_gray_shades(
        colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:
    pass

可以這樣使其更具可讀性

Color = tuple[int, int, int]

def remove_gray_shades(colors: list[Color]) -> list[Color]:
    pass

請參閱 typingPEP 484,其中描述了此功能。

型別提示 (type hint)

一種 註解,用於指定變數、類屬性或函式引數或返回值的預期型別。

型別提示是可選的,不受 Python 強制執行,但它們對 靜態型別檢查器 很有用。它們還可以幫助 IDE 進行程式碼補全和重構。

全域性變數、類屬性和函式的型別提示(但不包括區域性變數)可以透過 typing.get_type_hints() 訪問。

請參閱 typingPEP 484,其中描述了此功能。

通用換行 (universal newlines)

一種解釋文字流的方式,其中以下所有都被識別為行尾:Unix 行尾約定 '\n'、Windows 約定 '\r\n' 和舊 Macintosh 約定 '\r'。參見 PEP 278PEP 3116,以及 bytes.splitlines() 的額外用法。

變數註解 (variable annotation)

變數或類屬性的 註解

當註解變數或類屬性時,賦值是可選的

class C:
    field: 'annotation'

變數註解通常用於 型別提示:例如,這個變數期望接收 int

count: int = 0

變數註解的語法在 帶註解的賦值語句 一節中解釋。

請參閱 函式註解PEP 484PEP 526,它們描述了此功能。另請參閱 註解最佳實踐,以獲取使用註解的最佳實踐。

虛擬環境 (virtual environment)

一個協作隔離的執行時環境,允許 Python 使用者和應用程式安裝和升級 Python 分發包,而不會干擾同一系統上執行的其他 Python 應用程式的行為。

另請參閱 venv

虛擬機器 (virtual machine)

完全由軟體定義的計算機。Python 的虛擬機器執行位元組碼編譯器發出的 位元組碼

海象運算子 (walrus operator)

一種輕鬆地指代 賦值表示式 運算子 := 的方式,因為它看起來有點像海象,如果你把頭側過來。

Python 之禪 (Zen of Python)

一份有助於理解和使用該語言的 Python 設計原則和理念的清單。透過在互動式提示符下鍵入“import this”即可找到該清單。