內建函式

Python 直譯器有內建多個可隨時使用的函式和型別。以下按照英文字母排序列出。

內建函式

abs(number, /)

回傳一個數的絕對值,引數可以是整數、浮點數或有實現 __abs__() 的物件。如果引數是一個複數,回傳它的純量(大小)。

aiter(async_iterable, /)

回傳 非同步疊代器 做為 非同步可疊代物件。相當於呼叫 x.__aiter__()。

注意:與 iter() 不同,aiter() 沒有兩個引數的變體。

在 3.10 版被加入.

all(iterable, /)

如果 iterable 的所有元素皆為真(或 iterable 為空)則回傳 True。等價於:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
awaitable anext(async_iterator, /)
awaitable anext(async_iterator, default, /)

當進入 await 時,從給定的 asynchronous iterator 中回傳下一個項目(item),疊代完畢則回傳 default

這是內建函式 next() 的非同步版本,其行為類似於:

呼叫 async_iterator__anext__() 方法,回傳 awaitable。等待回傳疊代器的下一個值。如果指定 default,當疊代器結束時會回傳該值,否則會引發 StopAsyncIteration

在 3.10 版被加入.

any(iterable, /)

如果 iterable 的任一元素為真,回傳 True。如果 iterable 是空的,則回傳 False。等價於:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
ascii(object, /)

就像函式 repr(),回傳一個表示物件的字串,但是 repr() 回傳的字串中非 ASCII 編碼的字元會被跳脫 (escape),像是 \x\u\U。這個函式生成的字串和 Python 2 的 repr() 回傳的結果相似。

bin(integer, /)

將一個整數轉變為一個前綴為 "0b" 的二進位制字串。結果是一個有效的 Python 運算式。如果 integer 不是 Python 的 int 物件,那它需要定義 __index__() method 回傳一個整數。舉例來說:

>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'

如果不一定需要 "0b" 前綴,還可以使用如下的方法。

>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'{14:#b}', f'{14:b}'
('0b1110', '1110')

也請參閱 enum.bin() 以二補數表示負數。

可參考 format() 取得更多資訊。

class bool(object=False, /)

回傳一個布林值,即 True 或者 False。引數會使用標準的真值測試程序來轉換。如果引數為假或者被省略,則回傳 False;其他情況回傳 Truebool class(類別)是 int 的 subclass(子類別)(參見 數值型別 --- int、float、complex),其他 class 不能繼承自它。它只有 FalseTrue 兩個實例(參見 Boolean 型別 - bool)。

在 3.7 版的變更: 現在為僅限位置參數。

breakpoint(*args, **kws)

這個函式將呼叫 sys.breakpointhook() 函式,並將 argskws 傳遞給它。這將有效地讓你在特定的呼叫點進入除錯器。預設情況下,sys.breakpointhook() 呼叫 pdb.set_trace() 不須帶任何引數。這樣的設計是為了方便使用者,讓他們不需要額外地導入 pdb 模組或輸入太多程式就可以進入除錯器。然而,可以將 sys.breakpointhook() 設置為其他函式,並且 breakpoint() 將自動呼叫該函式,讓你進入所選擇的除錯器。如果無法存取 sys.breakpointhook() 這個函式,則此函式將引發 RuntimeError

預設情況下,breakpoint() 的行為可以透過 PYTHONBREAKPOINT 環境變數來更改。有關使用詳情,請參考 sys.breakpointhook()

請注意,如果 sys.breakpointhook() 被替換了,則無法保證此功能。

引發一個附帶引數 breakpointhook稽核事件 builtins.breakpoint

在 3.7 版被加入.

class bytearray(source=b'')
class bytearray(source, encoding, errors='strict')

回傳一個新的 bytes 陣列。bytearray class 是一個可變的整數序列,包含範圍為 0 <= x < 256 的整數。它有可變序列大部分常見的 method(如在 可變序列型別 中所述),同時也有 bytes 型別大部分的 method,參見 Bytes 和 Bytearray 的操作

選擇性參數 source 可以被用來以不同的方式初始化陣列:

  • 如果是一個 string,你必須提供 encoding 參數(以及選擇性地提供 errors );bytearray() 會使用 str.encode() method 來將 string 轉變成 bytes。

  • 如果是一個 integer,陣列則會有該數值的長度,並以 null bytes 來當作初始值。

  • 如果是一個符合 buffer 介面的物件,該物件的唯讀 buffer 會被用來初始化 bytes 陣列。

  • 如果是一個 iterable,它的元素必須是範圍為 0 <= x < 256 的整數,並且會被用作陣列的初始值。

如果沒有引數,則建立長度為 0 的陣列。

可參考 Binary Sequence Types --- bytes, bytearray, memoryviewBytearray 物件

class bytes(source=b'')
class bytes(source, encoding, errors='strict')

回傳一個新的 "bytes" 物件,會是一個元素是範圍為 0 <= x < 256 整數的不可變序列。bytesbytearray 的不可變版本 — 它的同樣具備不改變物件的 method,也有相同的索引和切片操作。

因此,建構函式的引數和 bytearray() 相同。

Bytes 物件還可以用文字建立,參見 String and Bytes literals

可參考 Binary Sequence Types --- bytes, bytearray, memoryviewBytes ObjectsBytes 和 Bytearray 的操作

callable(object, /)

如果引數 object 是可呼叫的,回傳 True,否則回傳 False。如果回傳 True,呼叫仍可能會失敗;但如果回傳 False,則呼叫 object 肯定會失敗。注意 class 是可呼叫的(呼叫 class 會回傳一個新的實例);如果實例的 class 有定義 __call__() method,則它是可呼叫的。

在 3.2 版被加入: 這個函式一開始在 Python 3.0 被移除,但在 Python 3.2 又被重新加入。

chr(codepoint, /)

回傳代表有特定 Unicode 編碼位置字元的字串。例如,chr(97) 回傳字串 'a',而 chr(8364) 回傳字串 '€'。這是 ord() 的逆函式。

引數的有效範圍是 0 到 1,114,111(16 進制表示為 0x10FFFF)。如果它超過這個範圍,會引發 ValueError

@classmethod

把一個 method 封裝成 class method(類別方法)。

一個 class method 把自己的 class 作為第一個引數,就像一個實例 method 把實例自己作為第一個引數。請用以下慣例來宣告 class method:

class C:
    @classmethod
    def f(cls, arg1, arg2): ...

@classmethod 語法是一個函式 decorator — 參見 函式定義 中關於函式定義的詳細介紹。

一個 class method 可以在 class(如 C.f())或實例(如 C().f())上呼叫。實例除了它的 class 資訊,其他都會被忽略。如果一個 class method 在 subclass 上呼叫,subclass 會作為第一個引數傳入。

Class method 和 C++ 與 Java 的 static method 是有區別的。如果你想瞭解 static method,請看本節的 staticmethod()。關於 class method 的更多資訊,請參考標準型別階層

在 3.9 版的變更: Class methods 現在可以包裝其他描述器,例如 property()

在 3.10 版的變更: Class method 現在繼承了 method 屬性(__module____name____qualname____doc____annotations__),並擁有一個新的 __wrapped__ 屬性。

自從版本 3.11 後不推薦使用,已從版本 3.13 中移除。: Class methods 不能再包裝其他的描述器,例如 property()

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

source 編譯成程式碼或 AST 物件。程式碼物件可以被 exec()eval() 執行。source 可以是一般的字串、bytes 字串、或者 AST 物件。參見 ast module(模組)的說明文件瞭解如何使用 AST 物件。

filename 引數必須是程式碼的檔名;如果程式碼不是從檔案中讀取,可以傳入一些可辨識的值(經常會使用 '<string>' 來替代)。

mode 引數指定了編譯程式碼時必須用的模式。如果 source 是一系列的陳述式,可以是 'exec';如果是單一運算式,可以是 'eval';如果是單個互動式陳述式,可以是 'single'(在最後一種情況下,如果運算式執行結果不是 None 則會被印出來)。

可選引數 flagsdont_inherit 控制啟用哪個編譯器選項以及允許哪個未來功能。如果兩者都不存在(或兩者都為零),則會呼叫與 compile() 相同旗標的程式碼來編譯。如果給定 flags 引數而未給定 dont_inherit(或為零)則無論如何都會使用由 flags 引數所指定的編譯器選項和未來陳述式。如果 dont_inherit 是一個非零整數,則使用 flags 引數 -- 周圍程式碼中的旗標(未來功能和編譯器選項)將被忽略。

編譯器選項和 future 陳述式使用 bits 來表示,可以一起被位元操作 OR 來表示複數個選項。需要被具體定義特徵的位元域可以透過 __future__ module 中 _Feature 實例中的 compiler_flag 屬性來獲得。編譯器旗標可以在 ast module 中搜尋有 PyCF_ 前綴的名稱。

引數 optimize 用來指定編譯器的最佳化級別;預設值 -1 選擇與直譯器的 -O 選項相同的最佳化級別。其他級別為 0(沒有最佳化;__debug__ 為真值)、1(assert 被刪除,__debug__ 為假值)或 2(說明字串 (docstring) 也被刪除)。

如果編譯的原始碼無效,此函式會引發 SyntaxErrorValueError

如果你想解析 Python 程式碼為 AST 運算式,請參閱 ast.parse()

引發一個附帶引數 sourcefilename稽核事件 compile。此事件也可能由隱式編譯 (implicit compilation) 所引發。

備註

'single''eval' 模式編譯多行程式碼時,輸入必須以至少一個換行符結尾。這使 code module 更容易檢測陳述式的完整性。

警告

如果編譯足夠大或者足夠複雜的字串成 AST 物件時,Python 直譯器會因為 Python AST 編譯器的 stack 深度限制而崩潰。

在 3.2 版的變更: 允許使用 Windows 和 Mac 的換行符號。此外,在 'exec' 模式不需要以換行符號結尾。增加了 optimize 參數。

在 3.5 版的變更: 在之前的版本,source 中包含 null bytes 會引發 TypeError

在 3.8 版被加入: ast.PyCF_ALLOW_TOP_LEVEL_AWAIT 現在可以傳遞旗標以啟用對頂層 awaitasync forasync with 的支援。

class complex(number=0, /)
class complex(string, /)
class complex(real=0, imag=0)

將單一字串或數字轉換為複數,或從實部和虛部建立複數。

例如:

>>> complex('+1.23')
(1.23+0j)
>>> complex('-4.5j')
-4.5j
>>> complex('-1.23+4.5j')
(-1.23+4.5j)
>>> complex('\t( -1.23+4.5J )\n')
(-1.23+4.5j)
>>> complex('-Infinity+NaNj')
(-inf+nanj)
>>> complex(1.23)
(1.23+0j)
>>> complex(imag=-4.5)
-4.5j
>>> complex(-1.23, 4.5)
(-1.23+4.5j)

如果引數是字串,它必須包含實數部分(格式與 float() 相同)或虛數部分(格式相同,但後綴為 'j''J'),或同時包含實數部分和虛數部分(在這種情況下,虛數部分的符號是必須的)。字串可以選擇以空白和圓括號 '('')' 包圍,這些都會被忽略。字串在 '+''-''j''J' 後綴和十進位數字之間不能包含空白。例如,complex('1+2j') 沒有問題,但 complex('1 + 2j') 會引發 ValueError。更精確地說,輸入必須符合以下文法中的 complexvalue 產生規則,在去除括號和前後空白字元之後:

complexvalue: floatvalue |
              floatvalue ("j" | "J") |
              floatvalue sign absfloatvalue ("j" | "J")

如果引數是一個數字,則建構函式會像 intfloat 一樣進行數值轉換。對於一個普通的 Python 物件 xcomplex(x) 會委派給 x.__complex__()。如果 __complex__() 未定義,則會回退 (fall back) 到 __float__()。如果 __float__() 未定義,則會再回退到 __index__()

如果提供兩個引數或使用關鍵字引數,每個引數可以是任何數值型別(包括複數)。如果兩個引數都是實數,則回傳一個有實數分量 real 和虛數分量 imag 的複數。如果兩個引數都是複數,則回傳一個包含實數分量 real.real-imag.imag 和虛數分量 real.imag+imag.real 的複數。如果其中一個引數是實數,則在上述運算式中只使用其實數分量。

也請參閱 complex.from_number(),它只接受單一數值引數。

如果省略所有引數,則回傳 0j

複數型別在 數值型別 --- int、float、complex 中有相關描述。

在 3.6 版的變更: 可以使用底線將程式碼文字中的數字進行分組。

在 3.8 版的變更: 如果 __complex__()__float__() 未定義,則會回退到 __index__()

在 3.14 版之後被棄用: 傳遞複數作為 realimag 引數現已被棄用;它只應作為單一位置引數傳遞。

delattr(object, name, /)

這是 setattr() 相關的函式。引數是一個物件和一個字串,該字串必須是物件中某個屬性名稱。如果物件允許,該函式將刪除指定的屬性。例如 delattr(x, 'foobar') 等價於 del x.foobarname 不必是個 Python 識別符 (identifier)(請見 setattr())。

class dict(**kwargs)
class dict(mapping, /, **kwargs)
class dict(iterable, /, **kwargs)

建立一個新的 dictionary(字典)。dict 物件是一個 dictionary class。參見 dictMapping Types --- dict 來瞭解這個 class。

其他容器型別,請參見內建的 listsettuple class,以及 collections module。

dir()
dir(object, /)

如果沒有引數,則回傳目前區域作用域 (local scope) 中的名稱列表。如果有引數,它會嘗試回傳該物件的有效屬性列表。

如果物件有一個名為 __dir__() 的 method,那麼該 method 將被呼叫,並且必須回傳一個屬性列表。這允許實現自訂 __getattr__()__getattribute__() 函式的物件能夠自訂 dir() 來報告它們的屬性。

如果物件不提供 __dir__(),這個函式會嘗試從物件已定義的 __dict__ 屬性和型別物件收集資訊。結果列表並不總是完整的,如果物件有自訂 __getattr__(),那結果可能不準確。

預設的 dir() 機制對不同型別的物件有不同行為,它會試圖回傳最相關而非最完整的資訊:

  • 如果物件是 module 物件,則列表包含 module 的屬性名稱。

  • 如果物件是型別或 class 物件,則列表包含它們的屬性名稱,並且遞迴查詢其基礎的所有屬性。

  • 否則,包含物件的屬性名稱列表、它的 class 屬性名稱,並且遞迴查詢它的 class 的所有基礎 class 的屬性。

回傳的列表按字母表排序,例如:

>>> import struct
>>> dir()   # show the names in the module namespace
['__builtins__', '__name__', 'struct']
>>> dir(struct)   # show the names in the struct module
['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__initializing__', '__loader__', '__name__', '__package__',
 '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
 'unpack', 'unpack_from']
>>> class Shape:
...     def __dir__(self):
...         return ['area', 'perimeter', 'location']
...
>>> s = Shape()
>>> dir(s)
['area', 'location', 'perimeter']

備註

因為 dir() 主要是為了便於在互動式提示字元時使用,所以它會試圖回傳人們感興趣的名稱集合,而不是試圖保證結果的嚴格性或一致性,它具體的行為也可能在不同版本之間改變。例如,當引數是一個 class 時,metaclass 的屬性不包含在結果列表中。

divmod(a, b, /)

它將兩個(非複數)數字作為引數,並在執行整數除法時回傳一對商和餘數。對於混合運算元型別,適用二進位算術運算子的規則。對於整數,運算結果和 (a // b, a % b) 一致。對於浮點數,運算結果是 (q, a % b)q 通常是 math.floor(a / b) 但可能會比 1 小。在任何情況下,q * b + a % ba 基本相等,如果 a % b 非零,則它的符號和 b 一樣,且 0 <= abs(a % b) < abs(b)

enumerate(iterable, start=0)

回傳一個列舉 (enumerate) 物件。iterable 必須是一個序列、iterator 或其他支援疊代的物件。enumerate() 回傳之 iterator 的 __next__() method 回傳一個 tuple(元組),裡面包含一個計數值(從 start 開始,預設為 0)和透過疊代 iterable 獲得的值。

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

等價於:

def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1
eval(source, /, globals=None, locals=None)
參數:
  • source (str | code object) -- 一個 Python 運算式。

  • globals (dict | None) -- 全域命名空間(預設值:None)。

  • locals (mapping | None) -- 區域命名空間(預設:None)。

回傳:

被求值的運算式之結果。

引發:

語法錯誤會報告為例外。

警告

此函式會執行任意程式碼。以不受信任的使用者提供的輸入來呼叫它將導致安全漏洞。

source 引數會被視為一條 Python 運算式(技術上而言,是條件列表)來剖析及求值,而 globalslocals 對映分別用作全域和區域命名空間。如果 globals dictionary 存在但缺少 __builtins__ 的鍵值,那 source 被剖析之前,將為該鍵插入對內建 builtins module dictionary 的引用。覆寫 __builtins__ 可以用來限制或更改可用的名稱,但這不是一種安全機制:被執行的程式碼仍然可以存取所有內建名稱。如果 locals 對映被省略,那它的預設值是 globals dictionary。如果兩個對映都被省略,則以在 eval() 被呼叫的環境中的 globalslocals 執行原始碼。請注意,eval() 在封閉 (enclosing) 環境中無法存取巢狀作用域 (non-locals),除非呼叫 eval() 的作用域已經有參照它們(例如透過 nonlocal 陳述式)。

範例:

>>> x = 1
>>> eval('x+1')
2

這個函式也可以用來執行任意程式碼物件(如被 compile() 建立的那些)。這種情況下,傳入的引數是程式碼物件而不是字串。如果編譯該物件時的 mode 引數是 'exec',那麼 eval() 回傳值為 None

提示:exec() 函式支援動態執行陳述式。globals()locals() 函式分別回傳目前的全域性和局部性 dictionary,它們對於將引數傳遞給 eval()exec() 可能會方便許多。

如果給定來源是一個字串,那麼其前後的空格和定位字元會被移除。

另外可以參閱 ast.literal_eval(),該函式可用來執行僅包含文字的運算式字串。

引發一個附帶程式碼物件為引數的稽核事件 exec。也可能會引發程式碼編譯事件。

在 3.13 版的變更: globalslocals 引數現在可以作為關鍵字傳遞。

在 3.13 版的變更: locals() 內建物件所述,已調整預設 locals 命名空間的語意。

exec(source, /, globals=None, locals=None, *, closure=None)

警告

此函式會執行任意程式碼。以不受信任的使用者提供的輸入來呼叫它將導致安全漏洞。

這個函式支援動態執行 Python 程式碼。source 必須是字串或者程式碼物件。如果是字串,那麼該字串將被剖析為一系列 Python 陳述式並執行(除非發生語法錯誤)。[1] 如果是程式碼物件,它將被直接執行。無論哪種情況,被執行的程式碼都需要和檔案輸入一樣是有效的(可參閱語言參考手冊中關於檔案輸入的章節)。請注意,即使在傳遞給 exec() 函式的程式碼的上下文中,nonlocalyieldreturn 陳述式也不能在函式之外使用。該函式回傳值是 None

無論哪種情況,如果省略了選擇性的部分,程式碼將在目前作用域內執行。如果只提供了 globals 引數,就必須是 dictionary 型別(且不能是 dictionary 的子類別),而且會被用作全域和區域變數。如果同時提供了 globalslocals,它們分別被用作全域和區域變數。如果提供了 locals,則它可以是任何對映物件。請記住在 module 層級中全域和區域變數是相同的 dictionary。

備註

exec 得到兩個獨立的物件作為 globalslocals,程式碼會被執行,就像它被嵌入在類別定義中一樣。這表示在執行的程式碼中定義的函式和類別將無法存取在頂層指定的變數(因為在類別定義中,「頂層」變數被視為類別變數)。

如果 globals dictionary 不包含 __builtins__ 鍵值,則將為該鍵插入對內建 builtins module dictionary 的引用。覆寫 __builtins__ 可以用來限制或更改可用的名稱,但這不是一種安全機制:被執行的程式碼仍然可以存取所有內建名稱。

closure 引數會指定一個閉包 (closure) — 它是一個 cellvar(格變數)的 tuple。只有在 object 是一個含有自由(閉包)變數 (free (closure) variables) 的程式碼物件時,它才有效。Tuple 的長度必須與程式碼物件的 co_freevars 屬性完全匹配。

引發一個附帶程式碼物件為引數的稽核事件 exec。也可能會引發程式碼編譯事件。

備註

內建 globals()locals() 函式各自回傳目前的全域和區域命名空間,因此可以將它們傳遞給 exec() 的第二個和第三個引數以供後續使用。

備註

預設情況下,locals 的行為如下面 locals() 函式描述的一樣。如果你想在 exec() 函式回傳時知道程式碼對 locals 的變動,請明確地傳遞 locals dictionary 。

在 3.11 版的變更: 增加了 closure 參數。

在 3.13 版的變更: globalslocals 引數現在可以作為關鍵字傳遞。

在 3.13 版的變更: locals() 內建物件所述,已調整預設 locals 命名空間的語意。

filter(function, iterable, /)

iterable 中函式 function 為 True 的那些元素,構建一個新的 iterator。iterable 可以是一個序列、一個支援疊代的容器、或一個 iterator。如果 functionNone,則會假設它是一個識別性函式,即 iterable 中所有假值元素會被移除。

請注意,filter(function, iterable) 相當於一個生成器運算式,當 function 不是 None 的時候為 (item for item in iterable if function(item));function 是 None 的時候為 (item for item in iterable if item)

請參閱 itertools.filterfalse(),只有 function 為 false 時才選取 iterable 中元素的互補函式。

class float(number=0.0, /)
class float(string, /)

回傳從數字或字串生成的浮點數。

例如:

>>> float('+1.23')
1.23
>>> float('   -12345\n')
-12345.0