news 2026/5/20 7:41:04

《流畅的Python》读书笔记03(补充01): 丰富的序列 - Python序列类型核心解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《流畅的Python》读书笔记03(补充01): 丰富的序列 - Python序列类型核心解析

《流畅的 Python》第 2 章“丰富的序列”系统性地阐述了 Python 序列类型的体系结构、核心操作及其背后的设计哲学。本章内容可归纳为以下四个核心模块:

一、序列类型的分类体系

Python 序列从两个正交维度进行分类,形成了清晰的类型矩阵。

分类维度类别核心特征典型类型
存储数据类型容器序列 (Container Sequences)存储任意类型对象的引用,内存布局灵活,可容纳异构数据。list,tuple,collections.deque
扁平序列 (Flat Sequences)存储相同类型的,内存连续紧凑,效率高但仅限基础类型。str,bytes,bytearray,memoryview,array.array
可变性可变序列 (Mutable Sequences)创建后内容可被修改。list,bytearray,array.array,collections.deque,memoryview
不可变序列 (Immutable Sequences)创建后内容不可变。tuple,str,bytes

这一分类是理解序列行为差异的基础。例如,列表 (list) 作为可变的容器序列,可以存放不同类型的数据并支持增删改;而字节串 (bytes) 作为不可变的扁平序列,只能存储字节且内容固定 。

二、高效构建与处理序列的核心语法

本章重点介绍了两种构建序列的高阶语法,其对比与应用场景如下:

特性列表推导式 (List Comprehension)生成器表达式 (Generator Expression)
语法[expr for item in iterable](expr for item in iterable)
返回值完整的list对象generator迭代器对象
内存行为立即求值,一次性构建整个列表,内存占用与数据量成正比。惰性求值,逐个产出元素,内存占用极低,适合处理大规模数据流。
迭代特性可多次迭代。仅能迭代一次,耗尽后即为空。
典型用例需要多次访问、索引或数据量较小的场景。作为函数参数(如sum(x for x in range(N)))或处理无法一次性装入内存的大数据集。

此外,元组拆包是高效处理记录型数据的核心技巧,支持并行赋值、使用*运算符捕获多余元素、嵌套解包以及与函数参数传递结合 (*args) 。

三、切片操作的深度机制与应用

切片不仅是获取子序列的简便语法,其背后由slice对象驱动,具备强大的可编程性。

  1. 设计约定:Python 切片遵循“左闭右开”原则([start:stop)),此约定使得区间长度计算直观(stop - start),且分割操作无重叠。
  2. 切片赋值:这是可变序列的专属能力,允许对原序列的指定区间进行等长或不等长的就地修改,甚至可用于删除元素(a[2:5] = [])。
  3. slice对象:表达式seq[start:stop:step]在内部会创建slice(start, stop, step)对象。开发者可以创建并复用slice对象,实现类似“命名切片”的模式,极大提升解析固定格式文本(如日志、表格)代码的可读性与可维护性 。

四、关键陷阱与最佳实践

本章揭示了若干容易导致错误的“陷阱”,并给出了对应的最佳实践。

  1. 序列乘法 (*) 的引用陷阱[[]] * 3会创建包含同一个列表引用的三份拷贝,修改其一将影响全部。正确初始化嵌套列表应使用列表推导式:[[] for _ in range(3)]
  2. 增量赋值 (+=) 的差异性+=对可变序列(如list)是就地修改;对不可变序列(如tuple)则创建新对象。尤其需要注意的是,对元组内可变元素(如列表)使用+=会导致“意外成功”——元素本身被修改,但赋值操作会抛出TypeError
  3. 具名元组 (namedtuple) 的使用collections.namedtuple用于创建带有字段名的轻量级类,其实例内存效率与普通元组相同,但通过名称访问字段极大地提升了代码可读性和调试便利性。它应作为仅存储数据的简单对象的首选,而非定义完整类 。

综上所述,本章的核心在于引导开发者超越对序列的浅层使用,深入理解其类型体系、内存模型及操作背后的原理,从而能够根据具体场景(如数据量、可变性要求、内存约束)选择最恰当的序列类型和操作方式,并规避常见的设计陷阱。


参考来源

  • 《流畅的Python》读书笔记03: 第一部分 数据结构 - 丰富的序列
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 7:34:35

别再纠结CCD还是CMOS了!从手机摄像头到工业相机,聊聊图像传感器到底该怎么选

图像传感器选型实战指南:从参数表到商业决策的深度解析 当智能安防摄像头需要兼顾夜间监控与功耗控制,当无人机视觉模块必须在高速飞行中捕捉清晰画面,当自动化检测设备面临毫秒级响应要求——图像传感器的选型直接决定了项目成败。面对CCD与…

作者头像 李华
网站建设 2026/5/20 7:34:32

Cursor安装OpenSkills MAC系统

1 安装 OpenSkills 前提需安装 node 环境。 打开MAC终端。 ## 全局安装 OpenSkills npm i -g openskills ## 验证安装成功(显示版本号即成功) openskills --version由于我的node.js版本是v18.20.8 但是openskills要求node.js版本>20,所以出…

作者头像 李华
网站建设 2026/5/20 7:34:27

用STM32的TIM1和GPIO中断,手把手实现带霍尔BLDC的按键调速(附PID代码)

基于STM32的霍尔BLDC电机调速系统实战开发指南 在工业自动化、机器人控制和消费电子领域,无刷直流电机(BLDC)因其高效率、长寿命和低噪音特性已成为首选驱动方案。本文将深入探讨如何利用STM32微控制器的TIM1定时器和GPIO中断功能,构建一个完整的带霍尔传…

作者头像 李华
网站建设 2026/5/20 7:33:51

用Gem5调试Garnet NoC:手把手教你添加DPRINTF并解读debug.txt

用Gem5调试Garnet NoC:从源码插桩到高效日志分析的实战指南 在复杂芯片设计领域,片上网络(NoC)的性能调优往往如同在迷雾中寻找路径。当传统仿真数据无法揭示数据包传输的微观行为时,掌握Gem5的深度调试技术就成为工程…

作者头像 李华