術語表

>>>

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

...

可以指

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

  • 內建常量 Ellipsis

抽象基類

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

註解

一個與變數、類屬性或函式引數或返回值關聯的標籤,按照慣例用作型別提示

本地變數的註解在執行時無法訪問,但全域性變數、類屬性和函式的註解分別儲存在模組、類和函式的 __annotations__ 特殊屬性中。

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

引數

呼叫函式時傳遞給函式(或方法)的值。 有兩種引數:

  • 關鍵字引數:函式呼叫中以識別符號(例如 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 引入。

屬性

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

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

可等待物件

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

BDFL

終身仁慈獨裁者,又名 Guido van Rossum,Python 的建立者。

二進位制檔案

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

另請參閱 文字檔案,它是一個能夠讀取和寫入 str 物件的檔案物件。

借用引用

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

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

類位元組物件

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

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

位元組碼

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 上分發的版本。“CPython”一詞在必要時用於將此實現與其他實現(如 Jython 或 IronPython)區分開來。

當前上下文

當前被 ContextVar 物件用來訪問(獲取或設定)上下文變數 的值的上下文contextvars.Context 物件)。每個執行緒都有自己的當前上下文。用於執行非同步任務的框架(請參閱 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)。請參閱 字典檢視物件

文件字串 (docstring)

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

鴨子型別 (duck-typing)

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

EAFP

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

表示式 (expression)

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

擴充套件模組 (extension module)

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

f-字串 (f-string)

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

檔案物件 (file object)

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

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

類檔案物件 (file-like object)

檔案物件的同義詞。

檔案系統編碼和錯誤處理程式 (filesystem encoding and error handler)

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

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

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

檔案系統編碼和錯誤處理程式在 Python 啟動時由 PyConfig_Read() 函式配置:請參閱 filesystem_encodingfilesystem_errorsPyConfig 成員。

另請參閱區域設定編碼

查詢器 (finder)

一個嘗試查詢正在匯入的模組的載入器的物件。

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

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

向下取整除法 (floor division)

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

自由執行緒 (free threading)

一種執行緒模型,其中多個執行緒可以在同一直譯器內同時執行 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 語句)。當生成器迭代器恢復時,它會從中斷的地方繼續(與每次呼叫都重新開始的函式相反)。

生成器表示式

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

>>> 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

基於雜湊的 pyc

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

可雜湊

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

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

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

IDLE

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

不朽

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

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

不可變的

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

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() 是三個鍵函式建構函式。有關如何建立和使用鍵函式的示例,請參閱排序 HOW TO

keyword argument

請參閱引數

lambda

一個匿名的行內函數,由一個表示式組成,該表示式在呼叫該函式時計算。建立 lambda 函式的語法是 lambda [parameters]: expression

LBYL

三思而後行。這種編碼風格在進行呼叫或查詢之前會顯式地測試先決條件。這種風格與 EAFP 方法形成對比,其特點是存在許多 if 語句。

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

列表

Python 內建的 序列。儘管它的名字如此,但它更類似於其他語言中的陣列,而不是連結串列,因為訪問元素的時間複雜度為 O(1)。

列表推導式

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

載入器

一個載入模組的物件。它必須定義一個名為 load_module() 的方法。載入器通常由 查詢器 返回。另請參閱

區域設定編碼

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

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

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

可以使用 locale.getencoding() 獲取區域設定編碼。

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

魔法方法

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

對映

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

元路徑查詢器

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

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

元類

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

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

方法

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

方法解析順序

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

模組

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

另請參閱

模組規範

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

另請參閱 模組規範

MRO

請參閱 方法解析順序

可變的

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

命名元組

術語“命名元組”適用於任何繼承自元組的型別或類,並且其可索引元素也可以使用命名屬性進行訪問。該型別或類也可能具有其他功能。

一些內建型別是命名元組,包括 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() 建立。後一種技術還添加了一些在手寫或內建命名元組中可能找不到的額外方法。

名稱空間

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

名稱空間包

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

另請參閱 模組

巢狀作用域

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

新式類

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

物件

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

最佳化作用域

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

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

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

形參

函式(或方法)定義中的命名實體,用於指定函式可以接受的實參(或在某些情況下,多個實參)。共有五種形參

  • 位置或關鍵字:指定一個實參,該實參可以透過位置或作為關鍵字實參傳遞。這是形參的預設型別,例如以下示例中的 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

形參可以指定可選和必需的實參,以及某些可選實參的預設值。

另請參閱 實參 詞彙條目,關於實參和形參之間差異的常見問題解答,inspect.Parameter 類,函式定義 部分,以及 PEP 362

路徑條目

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

路徑條目查詢器

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

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

路徑條目鉤子

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

基於路徑的查詢器

預設元路徑查詢器之一,它會在匯入路徑中搜索模組。

路徑類物件

表示檔案系統路徑的物件。路徑類物件是表示路徑的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

部分

單個目錄中(可能儲存在 zip 檔案中)的一組檔案,它們對名稱空間包做出貢獻,如 PEP 420 中定義的那樣。

位置實參

請參閱引數

臨時 API

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

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

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

臨時包

請參閱 臨時 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)
限定名稱

一個點分隔的名稱,顯示從模組的全域性作用域到該模組中定義的類、函式或方法的“路徑”,如 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'
引用計數

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

常規包

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

另請參見 名稱空間包

REPL

“讀取-求值-列印迴圈”的縮寫,是 互動式 直譯器 shell 的另一個名稱。

__slots__

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

序列

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

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

集合推導式

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

單分派

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

切片

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

軟棄用

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

與正常棄用不同,軟棄用不計劃刪除 API,也不會發出警告。

請參見 PEP 387:軟棄用

特殊方法

一種由 Python 隱式呼叫的方法,用於對型別執行特定操作,例如加法。此類方法的名稱以雙下劃線開頭和結尾。特殊方法記錄在 特殊方法名稱 中。

語句

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

靜態型別檢查器

一個讀取 Python 程式碼並對其進行分析的外部工具,查詢諸如型別不正確之類的問題。另請參見 型別提示typing 模組。

強引用

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

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

另請參見 借用引用

文字編碼

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

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

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

文字檔案

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

另請參閱二進位制檔案,瞭解能夠讀取和寫入類位元組物件的檔案物件。

三引號字串

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

型別

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

類型別名

透過將型別分配給識別符號而建立的型別的同義詞。

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

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,其中描述了此功能。

型別提示

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

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

可以使用 typing.get_type_hints() 訪問全域性變數、類屬性和函式的型別提示,但不能訪問區域性變數的型別提示。

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

通用換行符

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

變數註解

變數或類屬性的註解

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

class C:
    field: 'annotation'

變數註解通常用於型別提示:例如,此變數預期採用 int

count: int = 0

變數註解語法在 註解的賦值語句 部分中進行了解釋。

請參閱函式註解PEP 484PEP 526,其中描述了此功能。 另請參閱 註解最佳實踐,瞭解有關使用註解的最佳實踐。

虛擬環境

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

另請參閱venv

虛擬機器

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

Python 之禪

Python 設計原則和哲學的列表,有助於理解和使用該語言。可以透過在互動式提示符下鍵入“import this”找到該列表。