
Python 高级编程 026序列内核深剖 前言Bilibili 同步视频 一、双维剖序列分容器与扁平辨可变与不可变1.1 第一维度按存储元素划分「容器序列 扁平序列」✅ 容器序列包罗万象兼容任意数据类型✅ 扁平序列恪守本源仅存同源基础数据1.2 第二维度按修改权限划分「可变序列 不可变序列」⚙️ 二、溯源序列协议剖析抽象基类继承脉络2.1 不可变序列 Sequence 继承链路四大底层基类各司其职一一拆解 Python底层优化冷知识高频面试考点2.2 可变序列 MutableSequence 能力拓展 三、四大序列拼接操作辨异同、明底层、测性能3.1 加法运算符 新址拼接另起炉灶3.2 增量赋值 原地叠加复用内存3.3 extend方法迭代拆解逐元并入3.4 append方法整体入列不拆元素3.5 四大方法直观对照代码性能测速 测速结论硬核心性能数据 全文总结一文通晓序列全部核心要点 下期预告 前言Python之道循协议而行万物之象依规约而生。不同于静态语言固化的数据结构Python奉行协议编程思想无严苛的类继承枷锁只要补齐对应魔法方法便可拥有对应数据结构的能力。而序列乃是Python万物容器之中流砥柱。字符串、列表、元组、数组皆归序列麾下循环遍历、下标取值、成员判断皆赖序列赋能。很多开发者终日使用列表与字符串却不知序列底层协议为何分不清、、append、extend本质差异日常编码暗藏内存冗余、性能损耗隐患。本文以骈文行文深入浅出拆解Python序列全貌二分维度厘清序列品类之别溯源抽象基类吃透序列底层协议⚙️拆解四大拼接操作深挖底层魔法函数内存性能差异附全套可运行实测代码零基础亦可一键复现✅Bilibili 同步视频Python 高级编程 026序列内核深剖 一、双维剖序列分容器与扁平辨可变与不可变序列品类二分而立一横存数类型一纵改值权限。纵横相交囊括Python全部内置序列类型泾渭分明分毫不错。1.1 第一维度按存储元素划分「容器序列 扁平序列」容器序列者海纳百川无拘元素类型扁平序列者守一而终仅限同类元素。二者核心鸿沟在于元素存储自由度下文附实测代码直观佐证✅ 容器序列包罗万象兼容任意数据类型涵盖三类内置结构list列表、tuple元组、deque双端队列。如同万能收纳箱整型、字符串、列表、对象皆可同箱共存无需统一元素格式。# 容器序列实测代码多类型元素共存无报错my_list[1,Python序列,3.14,[1,2,3]]print(my_list)# 输出[1, Python序列, 3.14, [1, 2, 3]]# 结论列表作为典型容器序列完全支持异构元素存储✅ 扁平序列恪守本源仅存同源基础数据涵盖四类内置结构str字符串、bytes字节串、bytearray可变字节数组、array.array数值数组。如同专用储物格一格一类不可混杂。其中array.array极易与列表混淆列表动态包容万物数组初始化必须指定固定数据类型运行期间不可更改元素格式内存占用远低于列表数值计算性能更优。importarray# 扁平序列array实测初始化强制指定元素类型arrarray.array(i,[1,2,3,4])# i代表整型数组仅能存放整数# arr.append(abc) # 放开注释直接报错无法存入字符串异构元素print(arr)1.2 第二维度按修改权限划分「可变序列 不可变序列」可变序列者就地更迭改值不换内存地址不可变序列者一成永固改值必建新内存。序列分类包含类型底层特性适用场景 可变序列list、deque、bytearray、array.array原地增删改无新对象生成内存开销小频繁变更数据、海量数据存储️ 不可变序列tuple、str、bytes创建后只读修改必定生成新对象线程安全常量存储、字典键值、防止数据误修改核心小结所有序列皆可for循环遍历、支持下标取值二分维度相互独立例如列表既是容器序列亦是可变序列元组既是容器序列亦是不可变序列。⚙️ 二、溯源序列协议剖析抽象基类继承脉络知其表象更要知其内核。Python一切序列皆遵循统一协议规约协议本质就是必须实现的魔法方法合集。Python通过collections.abc内置抽象基类明文定义序列协议分为两大核心父类Sequence不可变序列基类序列协议之根基MutableSequence可变序列基类继承Sequence并拓展修改能力2.1 不可变序列 Sequence 继承链路Sequence 双层继承四层底层能力支撑序列全部基础功能Sequence → Reversible CollectionCollection → Sized Iterable Container四大底层基类各司其职一一拆解Sized长度协议实现__len__魔法方法支持全局函数len()获取容器长度Iterable迭代协议实现迭代器接口支撑for循环全程遍历Container成员协议实现__contains__魔法方法支撑x in 序列成员判断Reversible反转协议实现反转接口支撑reversed()反转遍历序列 Python底层优化冷知识高频面试考点执行value in obj判断时解释器存在优先级适配优先调用__contains__方法若无该方法自动降级调用__getitem__下标取值方法逐一遍历匹配保证代码向下兼容。2.2 可变序列 MutableSequence 能力拓展可变序列立于不可变序列之上新增三大核心修改类魔法方法赋能原地增删改__setitem__下标赋值对应obj[0] 100__delitem__下标删除对应del obj[0]__iadd__增量拼接对应运算符底层实现同时原生内置封装好的高频方法append、extend、pop、clear、remove无需开发者手动实现底层逻辑。自定义序列核心准则想要自研专属序列类只需继承对应抽象基类并且补齐所有抽象魔法方法即可完全契合Python原生序列协议无缝适配Python全部内置语法。 三、四大序列拼接操作辨异同、明底层、测性能日常编码之中、、append、extend四法常被混用看似结果相近实则内存机制、底层调用、入参规则、运行性能天差地别。下文骈文释义底层源码逻辑实测代码性能对比一次性彻底讲透3.1 加法运算符 新址拼接另起炉灶两列相加新内存而生原列不变旧地址长存。底层魔法方法__add__内存逻辑不修改原有两个序列直接开辟全新内存空间生成新序列对象入参限制严苛强制仅支持同类型序列拼接列表无法直接加元组性能短板海量数据拼接时频繁创建新对象内存碎片激增效率极低a[1,2]# 生成全新列表原列表a无任何变化ca[3,4]print(a)# [1,2] 原值不变print(c)# [1,2,3,4] 新对象# 报错演示列表元组类型不匹配# res a (5,6) # TypeError: can only concatenate list (not tuple) to list3.2 增量赋值 原地叠加复用内存就地增补不辟新址兼容万物迭代入列。底层魔法方法__iadd__内部直接调用extend方法内存逻辑原地修改原序列不生成新对象内存零额外开销入参限制极度宽松支持任意可迭代对象元组、range、生成器、字符串均可性能优势无内存拷贝大数据拼接性能碾压运算符a[1,2]a(3,4)# 支持元组arange(2)# 支持range可迭代对象print(a)# [1,2,3,4,0,1]3.3 extend方法迭代拆解逐元并入遍历迭代拆解元素逐一追加平铺入列。底层逻辑遍历传入可迭代对象拆分每一个元素逐个追加至原列表返回值无返回值纯原地修改适用场景需要将容器内部元素平铺合并而非嵌套容器3.4 append方法整体入列不拆元素整体收纳不拆分毫嵌套生成初心不改。底层逻辑直接将传入参数作为单个独立元素存入列表不做任何迭代拆分高频误区初学者经常混淆append与extend导致意外嵌套列表BUG3.5 四大方法直观对照代码性能测速importtime# 1. append整体添加lst1[1,2]lst1.append([3,4])print(append结果,lst1)# [1,2,[3,4]] 嵌套列表# 2. extend拆分添加lst2[1,2]lst2.extend([3,4])print(extend结果,lst2)# [1,2,3,4] 平铺列表# 性能测速10万次拼接耗时对比t1time.time()a[]foriinrange(100000):aa[i]print(拼接耗时,time.time()-t1)t2time.time()a[]foriinrange(100000):a[i]print(拼接耗时,time.time()-t2) 测速结论硬核心性能数据耗时远超大数据场景下**/extend性能是的百倍以上**开发中严禁循环内使用拼接序列。 全文总结一文通晓序列全部核心要点行文至此以骈句总括全文铭记序列精髓序列二分横竖有别容器纳异扁平存同。可变就地改不可建新容协议藏基类魔法驭行踪。加号建新址复用踪extend拆元素append纳全宗。序列分两类维度存储类型、修改权限精准区分所有内置序列序列协议依托abc抽象基类四大底层协议支撑遍历、长度、成员判断能力循环拼接优先使用与extend拒绝规避内存爆炸问题需要平铺元素选extend需要嵌套整体元素选append杜绝业务BUG 下期预告下一篇将手把手从零手写自定义可切片序列类完整实现序列全部魔法方法真正吃透Python协议编程精髓敬请关注✨ 写在最后技术不止代码逻辑更有底层原理。知其然亦知其所以然方能写出更Pythonic、更高性能、更少BUG的优质代码❤️