第四章 自定义序列类

目录

5.1 序列类型的分类

容器序列

扁平序列

可变序列

不可变序列

5.2 序列的abc继承关系

5.3 序列的+、+=和extend的区别

+操作符

+=操作符

extend方法

5.4 实现可切片的对象

5.5 bisect管理可排序序列

深入解释

5.6 什么时候我们不该用列表

深入解释

5.7 列表推导式、生成器表达式、字典推导式

列表推导式

生成器表达式

字典推导式

5.8 本章小结


在Python编程中,序列类型是最常用的数据结构之一。理解和掌握各种序列类型及其操作对于编写高效、可读性强的代码至关重要。本章将深入探讨Python中序列类型的分类、使用及实现自定义序列类的方法。

5.1 序列类型的分类

Python中的序列类型主要分为以下几类:

  1. 容器序列(list、tuple、collections.deque)
  2. 扁平序列(str、bytes、bytearray、array.array)
  3. 可变序列(list、deque、bytearray、array)
  4. 不可变序列(str、tuple、bytes)
容器序列

容器序列包含对不同类型对象的引用,可以存储任意类型的对象。常见的容器序列包括listtuplecollections.deque

示例代码:

from collections import dequelist_container = [1, 'a', 3.14]
tuple_container = (1, 'a', 3.14)
deque_container = deque([1, 'a', 3.14])print(list_container)
print(tuple_container)
print(deque_container)
扁平序列

扁平序列存储值本身,而不是对对象的引用。常见的扁平序列包括strbytesbytearrayarray.array

示例代码:

import arraystr_flat = 'hello'
bytes_flat = b'hello'
bytearray_flat = bytearray(b'hello')
array_flat = array.array('i', [1, 2, 3, 4])print(str_flat)
print(bytes_flat)
print(bytearray_flat)
print(array_flat)
可变序列

可变序列是可以在原地修改的序列类型,包括listdequebytearrayarray

示例代码:

list_mutable = [1, 2, 3]
list_mutable[0] = 4deque_mutable = deque([1, 2, 3])
deque_mutable.append(4)bytearray_mutable = bytearray(b'hello')
bytearray_mutable[0] = ord('H')print(list_mutable)
print(deque_mutable)
print(bytearray_mutable)
不可变序列

不可变序列不能在原地修改,一旦创建就不能改变。常见的不可变序列包括strtuplebytes

示例代码:

str_immutable = 'hello'
tuple_immutable = (1, 2, 3)
bytes_immutable = b'hello'print(str_immutable)
print(tuple_immutable)
print(bytes_immutable)

5.2 序列的abc继承关系

Python的collections.abc模块提供了许多抽象基类,这些基类定义了序列的基本接口,允许我们自定义符合这些接口的序列类型。

通过继承collections.abc模块中的抽象基类,可以确保自定义的序列类型实现了必要的方法和行为。例如,可以继承collections.abc.Sequence来创建一个自定义的不可变序列。

高级示例代码:

from collections.abc import Sequenceclass MySequence(Sequence):def __init__(self, data):self._data = datadef __getitem__(self, index):return self._data[index]def __len__(self):return len(self._data)my_seq = MySequence([1, 2, 3])
print(len(my_seq))  # 输出 3
print(my_seq[1])    # 输出 2

5.3 序列的++=extend的区别

在Python中,序列操作符++=和方法extend虽然都可以用来合并序列,但它们在实现和性能上有所不同。

+操作符

+操作符用于生成一个新的序列对象,将两个序列合并。适用于不可变序列和可变序列。

示例代码:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2  # 新建了一个列表print(list3)  # 输出 [1, 2, 3, 4, 5, 6]
+=操作符

+=操作符用于就地修改可变序列,效率较高。对于不可变序列,+=等同于+操作符。

示例代码:

list1 = [1, 2, 3]
list1 += [4, 5, 6]  # 就地修改print(list1)  # 输出 [1, 2, 3, 4, 5, 6]
extend方法

extend方法是特有的可变序列方法,效率最高,可以就地修改序列。

示例代码:

list2 = [1, 2, 3]
list2.extend([4, 5, 6])  # 就地修改print(list2)  # 输出 [1, 2, 3, 4, 5, 6]

5.4 实现可切片的对象

要实现支持切片操作的自定义序列类,需要实现__getitem__方法,并处理切片对象。Python的切片操作通过slice对象实现。自定义序列类需要检查传递给__getitem__的参数是否为slice对象,并相应地处理切片逻辑。

高级示例代码:

class MySequence(Sequence):def __init__(self, data):self._data = datadef __getitem__(self, index):if isinstance(index, slice):return self._data[index.start:index.stop:index.step]return self._data[index]def __len__(self):return len(self._data)my_seq = MySequence([1, 2, 3, 4, 5])
print(my_seq[1:4])  # 输出 [2, 3, 4]

5.5 bisect管理可排序序列

bisect模块用于管理有序序列,可以高效地插入和查找元素。常用函数包括bisect_leftbisect_rightinsort

深入解释

bisect模块提供了二分查找算法,适用于有序序列。insort函数可以在保持序列有序的情况下插入新元素。

高级示例代码:

import bisectsorted_list = [1, 3, 4, 7]
bisect.insort(sorted_list, 5)  # 在保持有序的情况下插入print(sorted_list)  # 输出 [1, 3, 4, 5, 7]index = bisect.bisect_left(sorted_list, 5)
print(index)  # 输出 3

5.6 什么时候我们不该用列表

列表虽然灵活且易用,但在某些情况下并不是最佳选择。例如,需要频繁插入或删除元素时,collections.deque可能是更好的选择。

深入解释

列表的随机访问速度快,但在头部插入或删除元素时效率较低。对于这些场景,可以考虑使用deque或者其他适合的数据结构。

高级示例代码:

from collections import deque# 使用 deque 进行高效的头部操作
dq = deque([1, 2, 3])
dq.appendleft(0)  # 在头部插入print(dq)  # 输出 deque([0, 1, 2, 3])dq.popleft()  # 从头部删除print(dq)  # 输出 deque([1, 2, 3])

5.7 列表推导式、生成器表达式、字典推导式

Python提供了列表推导式、生成器表达式和字典推导式,使得创建和处理序列更加简洁和高效。

列表推导式

列表推导式是创建列表的简洁方式,语法为[expression for item in iterable if condition]

示例代码:

squares = [x ** 2 for x in range(10)]
print(squares)  # 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器表达式

生成器表达式类似于列表推导式,但返回的是一个生成器对象,节省内存。

示例代码:

squares_gen = (x ** 2 for x in range(10))
for square in squares_gen:print(square)  # 逐个输出 0, 1, 4, 9, ...
字典推导式

字典推导式用于创建字典,语法为{key: value for item in iterable if condition}

示例代码:

squares_dict = {x: x ** 2 for x in range(10)}
print(squares_dict)  # 输出 {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

5.8 本章小结

在本章中,我们详细探讨了Python中序列类型的分类和实现,包括容器序列、扁平序列、可变序列和不可变序列。通过具体示例,我们展示了如何使用collections.abc模块创建自定义序列类,如何高效地管理排序序列,及何时避免使用列表。此外,我们还讨论了列表推导式、生成器表达式和字典推导式的用法。

通过这些内容,读者可以更深入地理解Python中的序列操作和实现,进而编写出更高效、可维护的代码。希望这篇博客能够帮助您在Python编程中更好地掌握和应用序列相关的知识。如果您有任何进一步的问题或需要更详细的解释,请随时告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248468.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第十章 多线程、多进程和线程池编程

目录 11.1 多线程编程 什么是多线程? 创建和启动线程 线程同步 11.2 多进程编程 什么是多进程? 创建和启动进程 进程间通信 11.3 线程池和进程池 什么是线程池和进程池? 使用线程池 使用进程池 11.4 选择多线程还是多进程 适用…

vue3 vxe-grid修改currentPage,查询数据的时候,从第一页开始查询

1、当我们设置好VxeGrid.Options进行数据查询的时候,下面是可能的设置&#xff1a; const gridOptions reactive<BasicTableProps>({id: UserTable,showHeaderOverflow: false,showOverflow: true,keepSource: true,columns: userColumns,size: small,pagerConfig: {cur…

【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录&#xff1a; 目录&#xff1a; 一、什么是单项散列函数&#xff1f; 1.1 如何验证文件是否被修改过 1.2 单项散列函数&#xff1a; 二、单向hash抗碰撞 2.1 弱抗碰撞&#xff08;Weak Collision Resistance&#xff09; 2.2 强抗碰撞&#xff08;Strong Collision Resista…

[GXYCTF2019]Ping Ping Ping1

打开靶机 结合题目名称&#xff0c;考虑是命令注入&#xff0c;试试ls 结果应该就在flag.php。尝试构造命令注入载荷。 cat flag.php 可以看到过滤了空格,用 $IFS$1替换空格 还过滤了flag&#xff0c;我们用字符拼接的方式看能否绕过,ag;cat$IFS$1fla$a.php。注意这里用分号间隔…

【光伏发电功率预测】方法综述学习笔记2《光伏发电功率超短期预测方法综述》

本文参考《光伏发电功率超短期预测方法综述》&#xff1a;https://d.wanfangdata.com.cn/periodical/ChlQZXJpb2RpY2FsQ0hJTmV3UzIwMjQwNzA0Eg5nZHlqczIwMjMwNzAyNBoIeHp4NW40YmU%3D 文章目录 摘要&#xff1a;引言1. 光伏发电功率的影响因素分析1.1传递过程中的影响因素1.1.1…

DDei在线设计器-数据格式说明

数据格式说明 DDei的所有设计数据都以文件为单位保存在一个JSON对象中。JSON对象包含了全量的页签、舞台、图层、控件的位置以及属性信息。开发人员可以存储这个JSON到服务端数据库中&#xff0c;从而轻易的实现保存功能&#xff1b;也解析这个JSON&#xff0c;将其转换成自己业…

对红酒品质进行数据分析(python)

http://t.csdnimg.cn/UWg2S 数据来源于这篇博客&#xff0c;直接下载好csv文件。 这篇内容均在VScode的jupyter notebook上完成&#xff0c;操作可以看我的另一篇博客&#xff1a;http://t.csdnimg.cn/69sDJ 一、准备工作 1. 导入数据库 #功能是可以内嵌绘图&#xff0c;并…

用了6年git,不知道cherry-pick是啥意思

背景 可能是测试开发角色原因&#xff0c;平时很少有代码冲突或多人协同的编码场景。今天有个协同项目&#xff0c;需要提交自己的代码到其它业务的代码库中&#xff0c;这个代码库是分支开发分支上线模式&#xff0c;同时会有多个同事提交代码&#xff0c;然后模块负责的同学…

常用优秀内网穿透工具(实测详细版)

文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用&#xff1a; 线性规划的数学模型的三要素&#xff1a; 线性规划的一般步骤&#xff1a; 例1&#xff1a; 人数选择 例2 &#xff1a;任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

vue2.0结合使用 el-scrollbar 和 v-for实现一个横向滚动的元素列表,并且能够自动滚动到指定元素(开箱即用)

效果图&#xff1a; 代码&#xff1a; <div class"gas-mode-item-body"><el-scrollbar style"width: 300px;height: 100%;" wrap-style"overflow-y:hidden" ref"scrollbarRef"><div style"display: flex&quo…

Python Linux环境(Centos8)安装minicoda3+jupyterlab

文章目录 安装miniconda安装python环境启动 最近服务器检查&#xff0c;我下面的服务器有漏洞&#xff0c;不得已重装了&#xff0c;正好记录下怎么从零到python写代码。 安装miniconda miniconda是anconda的精简版&#xff0c;就是管理python环境的得力助手。 # 创建一个名…

7.18 学习笔记 解决分页越界问题 及分页查询

1.解决分页越界 1.1出现的问题 于是我索性把分页去掉想是不是就可以了&#xff0c;结果发现还不行 1.2解决方法 就当我找了一两个小时抓耳挠腮时&#xff0c;万幸在csdn上找到了相关的帖子&#xff0c;在此感谢一下那位大佬。 原因是我的实体类中没有构造方法&#xff0c;那…

软考系规百天备考攻略:基础阶段的三轮强化

早在今年4-5月份的时候&#xff0c;我就曾经讲过系统规划与管理师的备考建议&#xff0c;也就是先从教程学起&#xff0c;先读教程&#xff0c;而且我也说过&#xff0c;不要迷信任何培训班或者培训视频&#xff0c;任何培训班或者培训视频都不能取代你认真读至少一遍教程&…

BIOMOD2 物种分布模拟教程

原文链接&#xff1a;BIOMOD2 物种分布模拟教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609373&idx5&sn492e7597314a5f9e358c35e4780b275f&chksmfa826dfacdf5e4ecf8ac06bdeba5469b31650bdbefbc8fb88b79c0f332714c453a4cc058d29f&token155…

Calibration相机内参数标定

1.环境依赖 本算法采用张正友相机标定法进行实现&#xff0c;内部对其进行了封装。 环境依赖为 ubuntu20.04 opencv4.2.0 yaml-cpp yaml-cpp安装方式&#xff1a; &#xff08;1&#xff09;git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地 &a…

15- 微分方程

对三角函数不敏感

模块化沙箱:解锁数据防泄密的终极密码

在这个数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。然而&#xff0c;数据泄露的威胁如同暗夜中的幽灵&#xff0c;随时可能侵袭企业的信息安全防线。面对日益复杂的内外部风险&#xff0c;企业亟需一种既高效又灵活的安全解决方案&#xff0c;来保护其核心数据不…

专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!

软件介绍 Adobe Acrobat Pro DC 2024绿色便携版是一款功能强大的PDF编辑和转换软件&#xff0c;由Adobe公司推出。它是Acrobat XI系列的后续产品&#xff0c;提供了全新的用户界面和增强功能。用户可以借助这款软件将纸质文件转换为可编辑的电子文件&#xff0c;便于传输、签署…

透视矫正插值

https://www.cnblogs.com/straywriter/articles/15889273.html https://www.comp.nus.edu.sg/~lowkl/publications/lowk_persp_interp_techrep.pdf https://8.136.115.103/perspective-correct-interpolation%E9%80%8F%E8%A7%86%E6%A0%A1%E6%AD%A3%E6%8F%92%E5%80%BC/ 透视矫正…