# Python 标准库

Python 标准库 (opens new window)非常庞大,所提供的组件涉及范围十分广泛。

# 系统交互

访问系统资源、环境变量、命令行参数等。

# sys

sys (opens new window) 模块提供了一些变量和函数。这些变量可能被解释器使用,也可能由解释器提供。

  • sys.argv (opens new window)

    一个列表,其中包含了被传递给 Python 脚本的命令行参数。

    argv[0] 为脚本的名称。

    • 如果没有脚本名被传递给 Python 解释器,argv[0] 为空字符串。

    • 如果是通过 Python 解释器的命令行参数 -c 来执行,argv[0] 会被设置成字符串 '-c'

    • 给定脚本名是 -(标准输入)时,argv[0]'-'

    • 如果使用选项 -m moduleargv[0] 就是包含目录的模块全名。

    python -c "import sys; print(sys.argv)"
    echo -e 'import sys\nprint(sys.argv)' | python -
    

    解释器不处理 -c command-m module 之后的选项,而是直接留在 sys.argv 中由命令或模块来处理。

# os

os (opens new window) 模块提供了一种使用与操作系统相关的功能的便捷式途径。

# argparse

argparse (opens new window) 模块是用于命令行选项、参数和子命令的解析器。

# 文件与目录操作

文件读写、路径处理、压缩解压。

# io

io (opens new window) 模块提供了 Python 用于处理各种 IO 类型的主要工具。

# os.path

os.path (opens new window) 模块实现了一些路径名称相关函数。

  • os.path.join (opens new window)(path, *paths)

    智能地拼接一个或多个路径部分。

    import os
    
    folder = "my_folder"
    subfolder = "sub_folder"
    filename = "my_file.txt"
    
    full_path = os.path.join(folder, subfolder, filename)
    
    print("Full Path:", full_path)
    

# pathlib

pathlib (opens new window) 模块提供表示文件系统路径的类,其语义适用于不同的操作系统。

# 数学与数值计算

数学运算、随机数生成、统计。

# decimal

decimal (opens new window) 模块提供对快速且正确舍入的十进制浮点运算的支持。

它提供了优于浮点数据类型的几个优点:

  • Decimal 类型的设计是基于考虑人类习惯的浮点数模型。

  • Decimal 数字的表示是完全精确的。

  • Decimal 模块包含有效位的概念。

  • 与基于硬件的二进制浮点不同,十进制模块具有用户可更改的精度(默认为 28 位)。

    from decimal import *
    
    getcontext().prec = 6
    print(Decimal(1) / Decimal(7))
    

# fractions

fractions (opens new window) 模块支持分数运算。

分数实例可以由一对整数,一个分数,或者一个字符串构建而成。

# random

random (opens new window) 模块实现了各种分布的伪随机数生成器。

# 时间与日期

时间处理、格式化和计时。

# datetime

datetime (opens new window) 模块提供了用于操作日期和时间的类。

# calendar

calendar (opens new window) 模块提供了与日历相关的实用函数。

静态方法

# time

time (opens new window) 模块提供了各种与时间相关的函数。

  • time.sleep (opens new window)(secs)

    在给定的秒数内暂停调用线程的执行。该参数可以是一个浮点数,以指示更精确的睡眠时间。

# 数据序列化

数据转换、存储和传输。

# json

json (opens new window) 模块是用于处理 JSON 数据的标准库。

  • json.dumps (opens new window)()

    序列化 Python 对象为 JSON 字符串。

    import json
    
    data = {"name": "Alice", "age": 25, "is_student": False}
    json_str = json.dumps(data)
    print(json_str)
    
  • json.loads (opens new window)()

    反序列化 JSON 字符串为 Python 对象。

    import json
    
    json_str = '{"name": "Alice", "age": 25, "is_student": false}'
    data = json.loads(json_str)
    print(data)
    

# 网络与通信

网络协议、HTTP 请求、Socket 通信。

# http

http (opens new window) 是一个包:

# 并发与异步编程

多线程、多进程、异步任务管理。

# threading

threading (opens new window) 模块在较低级别的 _thread (opens new window) 模块之上构建较高级别的线程接口。

  • Thread

    Thread (opens new window) 类代表一个在独立控制线程中运行的活动。

    有两种方式指定活动:

    当线程对象一旦被创建,其活动必须通过调用线程的 start() (opens new window) 方法开始,这会在独立的控制线程中发起调用 run() (opens new window) 方法。

    其他线程可以调用一个线程的 join() (opens new window) 方法,这会阻塞调用该方法的线程,直到被调用 join() (opens new window) 方法的线程终结。

    以下为通过构造函数创建线程,操作共有变量,线程不安全的例子:

    import threading
    import time
    
    count = 0
    
    def add():
        global count
        tmp = count
        time.sleep(0.001)
        count = tmp + 1
    
    
    thread_list = []
    for _ in range(100):
        thread = threading.Thread(target=add)
        thread_list.append(thread)
    
    for j in thread_list:
        j.start()
    
    for j in thread_list:
        j.join()
    
    print(count)
    
  • Lock

    threading.Lock (opens new window) 是实现原始锁对象的类。一旦一个线程获得一个锁,会阻塞随后尝试获得锁的线程,直到它被释放;任何线程都可以释放它。

    以下为通过锁,操作共有变量,线程安全的例子:

    import threading
    import time
    
    count = 0
    lock = threading.Lock()
    
    def add():
        global count
        lock.acquire()
        tmp = count
        time.sleep(0.001)
        count = tmp + 1
        lock.release()
    
    thread_list = []
    for _ in range(100):
        thread = threading.Thread(target=add)
        thread_list.append(thread)
    
    for j in thread_list:
        j.start()
    
    for j in thread_list:
        j.join()
    
    print(count)
    

    Python 提供了上下文管理器来简化锁的使用,确保锁在不再需要时正确释放。

    当进入语句块时 acquire() (opens new window) 方法会被调用,退出语句块时 release() (opens new window) 会被调用。

    因此,以下片段:

    with some_lock:
        # do something...
    

    相当于

    some_lock.acquire()
    try:
        # do something...
    finally:
        some_lock.release()
    

# concurrent.futures

concurrent.futures (opens new window) 模块提供异步执行可调用对象高层接口。

异步执行可以由 ThreadPoolExecutor (opens new window) 使用线程或由 ProcessPoolExecutor (opens new window) 使用单独的进程来实现。两者都是实现抽像类 Executor (opens new window) 定义的接口。

  • Executor (opens new window)

    抽象类提供异步执行调用方法。要通过它的子类调用,而不是直接调用。

    • submit (opens new window)(fn, /, *args, **kwargs)

      调度可调用对象 fn,以 fn(*args, **kwargs) 方式执行并返回一个代表该可调用对象的执行的 Future (opens new window) 对象。

      with ThreadPoolExecutor(max_workers=1) as executor:
          future = executor.submit(pow, 323, 1235)
          print(future.result())
      
  • ThreadPoolExecutor (opens new window)

    ThreadPoolExecutor (opens new window)Executor (opens new window) 的子类,它使用线程池来异步执行调用。

    以下为多线程操作共有变量,线程不安全的例子:

    from concurrent.futures import ThreadPoolExecutor, as_completed
    import time
    
    count = 0
    
    def add():
        global count
        tmp = count
        time.sleep(0.001)
        count = tmp + 1
        return count
    
    executor = ThreadPoolExecutor(max_workers=2)
    futures = [executor.submit(add) for i in range(1, 6)]
    
    for future in as_completed(futures):
        result = future.result()
        print(result)
    
    print(count)
    
  • concurrent.futures.as_completed (opens new window)(fs, timeout=None)

    返回 fs 给出的 Future (opens new window) 实例的迭代器,按线程完成的顺序返回 futures

# 调试与开发工具

代码测试、性能分析、日志记录。

# logging

logging (opens new window) 模块实现了灵活的事件日志系统的函数与类。

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("登录请求成功")

# 数据类型与结构

扩展或操作数据结构。

# itertools

# 安全与加密

哈希、加密、安全随机数。

# hashlib

hashlib (opens new window) 模块实现了一个针对不同哈希算法的通用接口。

  • hashlib.md5 (opens new window)()

    md5 = hashlib.md5()
    md5.update("123".encode('utf_8'))
    sign = md5.hexdigest()
    

# secrets

生成安全随机数(替代 random)。

# hmac

消息签名算法。

# 其他工具类

# re

re (opens new window) 模块提供了与 Perl 语言类似的正则表达式匹配操作。

静态方法

  • re.sub (opens new window)(pattern, repl, string, count=0, flags=0)

    返回通过使用 repl 替换在 string 中出现的 pattern 而获得的字符串。count 是可选参数,表示最多替换的次数,默认值为 0,表示替换所有匹配项。

    # 替换掉所有的 HTML 标签
    re.sub(r'<.*?>', '', time_str)
    
  • re.search (opens new window)(pattern, string, flags=0)

    扫描整个 string,查找正则表达式 pattern 产生匹配的第一个位置,并返回相应的 Match (opens new window)

    # 判断字符串中,是否存在中文
    if re.search(r'[\u4e00-\u9fff]', times_raw):
        times_raw = ""
    

# string

string (opens new window) 模块提供了一组常用的字符串操作工具和常量。

# uuid

uuid (opens new window) 模块提供了不可变的 UUID (opens new window) 对象和 uuid1() (opens new window), uuid3() (opens new window), uuid4() (opens new window), uuid5() (opens new window) 等函数用于生成 RFC 4122 (opens new window) 所定义的第 1, 3, 4 和 5 版 UUID

# 用一串 32 位十六进制数字创建一个 UUID
uuid.UUID('c4396c2e-cf4c-46aa-a4ef-3d20f17d88d5')

str(uuid) 返回一个 12345678-1234-5678-1234-567812345678 形式的字符串,其中 32 位十六进制数字代表 UUID

  • uuid.uuid4 (opens new window)()

    生成一个随机的 UUID

  • uuid.uuid5 (opens new window)(namespace, name)

    根据 namespacename 的 SHA-1 哈希值生成一个 UUID

    namespace = uuid.UUID('c4396c2e-cf4c-46aa-a4ef-3d20f17d88d5')
    name = 'example.com'
    uuid5 = uuid.uuid5(namespace, name)
    

# copy

copy (opens new window) 模块提供了通用的浅层复制和深层复制操作。

# functools

functools (opens new window) 模块应用于高阶函数,即参数或返回值为其他函数的函数。通常来说,此模块的功能适用于所有可调用对象。

  • functools.wraps (opens new window)

    wraps (opens new window) 是一个装饰器函数,使得被包装的函数的元信息(如函数名、文档字符串等)能够被正确地传递给包装后的函数,避免元信息的丢失。

    例如,对 add 函数进行包装,会丢失 add 的元信息,通过 wraps 避免元信息的丢失。

    import functools
    
    def logger(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper
    
    @logger
    def add(a, b):
        """Add two numbers."""
        return a + b
    
    print(add.__name__)
    print(add.__doc__)
    

    大致等价于:

    import functools
    
    def logger(func):
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        wrapper.__name__ = func.__name__
        wrapper.__doc__ = func.__doc__
        return wrapper
    
    @logger
    def add(a, b):
        """Add two numbers."""
        return a + b
    
    print(add.__name__)
    print(add.__doc__)
    

# venv

venv (opens new window) 是创建虚拟环境的标准工具。从 Python 3.3 开始成为 Python 的组成部分;从 Python 3.4 开始,它会默认安装 pip 到所创建的全部虚拟环境。

virtualenvvenv 的第三方替代及其前身。它允许在 Python 3.4 之前的版本中使用虚拟环境,那些版本或是完全不提供 venv,或是不会自动安装 pip 到所创建的虚拟环境。

  • 创建虚拟环境

    python3 -m venv DIR
    
  • 激活虚拟环境

    source DIR/bin/activate  # Linux
    DIR\Scripts\activate     # Windows
    
  • 退出虚拟环境

    source DIR/bin/deactivate  # Linux
    DIR\Scripts\deactivate     # Windows