# 簡介

「Python 函式庫」包含了許多不同的部分。

函式庫中包括被視為程式語言「核心」部分的資料型態，像是數字 (number) 或是串列 (list)。對於這些型別，Python 核心對這些字面值 (literal) 的形式做定義，並對它們的語意制定了一些限制，但在此同時卻不把文字對應的語意完全定義。（另一方面，Python 在語法面上有確實的定義，例如拼字或是運算元次序）

Python 函式庫也囊括了內建函式與例外處理——這些物件都可以不用透過 `import` 陳述式來引入 Python 程式中就能使用。函式庫中有部份是被 Python 核心所定義的，但在這裡僅解釋最核心的語意部分。

整個函式庫中包含了許多模組，有許多方法可以從函式庫中取用這些模組。有些模組是以 C 語言撰寫並建置於 Python 編譯器之中，其他的是由 Python 撰寫並以源碼的方式 (source form) 引入。有些模組提供的功能是專屬於 Python 的，像是把 stack trace 印出來；有些則是針對特定作業系統，去試著存取特定硬體；還有些提供對特定應用的功能與操作介面，像是 World Wide Web。模組的使用情況會因機器與 Python 的版本而不同，部分模組是開放所有版本以及 Port 的 Python 來使用的，但有些會因系統支援或需求在某些版本或系統下無法使用，甚至有些僅限在特定的設定環境下才能使用。

這個手冊會「深入淺出」地介紹 Python 函式庫。它會先介紹一些內建函式、資料型態、和一些例外處理，再來一章章的主題式介紹相關模組。

這代表如果你從這個手冊的最開始讀起，並在感到無聊時跳到下一個章節，你仍然可以得到一個對 Python 函式庫所支援的模組與其合理應用的概觀。當然，你沒有必要像是在讀一本小說一樣讀這本手冊——你可以快速瀏覽目錄（在手冊的最前頭）、或是你可以利用最後面的索引來查詢特定的函式或模組。最後，如果你享受閱讀一些隨機的主題，你可以選擇一個隨機的數字並開始閱讀（見 `random` 模組) 。不管你想要以什麼順序來閱讀這個手冊，內建函式會是一個很好的入門，因為手冊中其他章節都預設你已經對這個章節有一定的熟悉程度。

讓我們開始吧！

## 可用性之註釋

- 如果出現「適用：Unix」註釋，則代表該函式普遍存在於 Unix 系統中，但這並不保證其存在於某特定作業系統。

- 如果沒有分別註釋的話，有標明「適用：Unix」註釋的所有函式也都於 macOS 上支援，因其建於 Unix 核心之上。

- 如果一条可用性注释同时包含最低 Kernel 版本和最低 libc 版本，则两个条件都必须满足。 例如当某个特性带有注释 可用性: Linux >= 3.17 且 glibc >= 2.27 则表示同时要求 Linux 3.17 以上版本和 glibc 2.27 以上版本。

### WebAssembly 平台

WebAssembly 平台 `wasm32-emscripten` (Emscripten) 和 `wasm32-wasi` (WASI) 分别提供了 POSIX API 的一个子集。 WebAssembly 运行时和浏览器都处于沙盒模式中并具有对主机和外部资源的受限访问权。 任何使用了进程、线程、网络、信号或其他形式的进程间通信 (IPC) 的 Python 标准库模块都或者不可用，或者其作用方式与在其他类 Unix 系统上不同。 文件 I/O, 文件系统和 Unix 权限相关的函数也同样会受限。 Emscripten 不允许阻塞式 I/O。 其他阻塞式操作如 `sleep()` 则会阻塞浏览器的事件循环。

Python 在 WebAssembly 平台上的特性与行为依赖于 Emscripten-SDK 或 WASI-SDK 的版本, WASM 运行时 (浏览器, NodeJS, wasmtime) 以及 Python 编译时旗标。 WebAssembly, Emscripten 和 WASI 都是尚在不断演化中的标准；某些特性例如网络可能会在未来被支持。

对于在浏览器上运行的 Python，用户可以考虑 Pyodide 或 PyScript。 PyScript 是在 Pyodide 之上构建的，后者本身则是在 CPython 和 Emscripten 之上构建的。 Pyodide 提供了对浏览器的 JavaScript 和 DOM API 的访问并通过 JavaScript 的 `XMLHttpRequest` 和 `Fetch` API 提供了受限的网络功能。

- 进程相关的 API 或者不可用或者将始终报错失败。 这包括生成新进程 (`fork()`, `execve()`), 等待进程 (`waitpid()`), 发送信号 (`kill()`) 或者以其他方式与进程交互的 API。 `subprocess` 可以被导入但将没有任何作用。

- `socket` 模块可以使用，但将会受限而使其行为与在其他平台上不一致。 在 Emscripten 上，套接字将始终为非阻塞式的并且要求额外的 JavaScript 代码和服务器上的辅助工具来代理通过 WebSockets 的 TCP；请参阅 Emscripten Networking 了解详情。 WASI snapshot preview 1 只允许来自现有文件描述符的套接字。

- 某些函数是不执行任何操作的空壳或是始终返回硬编码的值。

- 有关文件描述符、文件访问权、文件所有权和链接的函数均受到限制并且不支持某些操作。 例如，WASI 不允许具有绝对文件名的符号链接。