W
e
l
c
o
m
e
: )

Python 中常用的序列

在 Python 中,序列(Sequence)是指元素按特定顺序排列、可通过非负整数索引访问的一类数据结构。根据内存存储方式和是否可变,可以分为以下几类:

1 按可变性分类的核心序列

序列类型 可变性 构造方式 元素类型 典型内存特征
列表 list ✅ 可变 [1, 2, 3] 任意对象(异构) 动态数组,存对象引用
元组 tuple ❌ 不可变 (1, 2, 3) 任意对象(异构) 定长数组,存对象引用
字符串 str ❌ 不可变 "hello" 仅 Unicode 字符 紧凑存储(见前文)
字节串 bytes ❌ 不可变 b"abc" 0–255 整数 连续内存块
字节数组 bytearray ✅ 可变 bytearray(b"abc") 0–255 整数 连续内存块(可原地修改)
范围 range ❌ 不可变 range(0, 10) 整数(惰性生成) 仅存 start/stop/step

1.1 示例对比

# 列表:动态增删
lst = [1, "a", 3.14]
lst.append(4)  # [1, 'a', 3.14, 4]
print(lst)

# 元组:不可修改,常用作字典键
tup = (1, "a", 3.14)
# tup[0] = 2        # TypeError
print(tup)

# 字节数组:二进制数据原地修改
barr = bytearray(b"hello")
barr[0] = 72  # bytearray(b'Hello')
print(barr)

images/Python_中常用的序列/file-20260418161200083.png

2 标准库中的特殊序列(collections 模块)

这些类型实现了序列协议,但行为与内置序列有差异:

类型 用途 关键特性
deque 双端队列 两端 append/pop 均为 O(1)
namedtuple 具名元组 可通过字段名访问(如 p.x
UserList 列表包装器 便于继承并自定义列表行为
from collections import deque, namedtuple

# deque:高效头尾操作
dq = deque([1, 2, 3])
dq.appendleft(0)  # deque([0, 1, 2, 3])
print(dq)

# namedtuple:自解释的数据结构
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p[0])  # 10 10

images/Python_中常用的序列/file-20260418161457846.png

3 其他满足序列协议的第三方类型

数组 array.array(标准库模块):

import array

arr = array.array('i', [1, 2, 3])  # 类型码 'i' 表示有符号整型
arr.append(4)  # 元素必须是同类型 C 数据,内存极紧凑
print(arr)

NumPy 数组 ndarray(第三方库):

import numpy as np

arr = np.array([1, 2, 3])
print(arr[1:])  # 支持切片等序列操作,并附带广播等高级特性

内存视图 memoryview
本身不是序列,但可通过缓冲区协议操作 bytes / bytearray 底层内存而不复制数据。

4 通用序列操作(所有序列均支持)

操作 示例 说明
索引 s[0]s[-1] 正向/反向取单个元素
切片 s[1:5:2] 返回同类型新序列
拼接 s + t 仅限同类型(如 list+list
重复 s * n 重复 n 次
长度 len(s) 元素个数
成员检查 x in s 线性搜索(str/bytes 可子串搜索)
最小/最大 min(s)max(s) 元素必须可比较
迭代 for item in s: 按索引顺序遍历
s = [10, 20, 30, 40]
print(s[1:3])  # [20, 30]
print(25 in s)  # False
print(len(s))  # 4

images/Python_中常用的序列/file-20260418162142126.png

5 选择指南速查

场景需求 推荐序列类型
需要频繁增删元素(尾部) list
需要频繁头尾操作 collections.deque
数据不应被修改(常量、字典键) tuple
处理文本数据 str
处理二进制文件/网络包 bytes / bytearray
数值数组且追求内存效率 array.array 或 numpy.ndarray
生成大范围整数循环 range(惰性,内存 O(1))

5.1 自检:我的对象是序列吗?

可通过检查是否实现 __getitem__ 和 __len__ 协议来判定:

def is_sequence(obj):
    return hasattr(obj, '__getitem__') and hasattr(obj, '__len__')


print(is_sequence([1, 2]))  # True
print(is_sequence("abc"))  # True
print(is_sequence({1, 2}))  # False(集合无序,无 __getitem__)

images/Python_中常用的序列/file-20260418162344376.png

posted @ 2026-04-18 16:25  挖掘鱼  阅读(27)  评论(0)    收藏  举报