python自定义序列类深入学习

news2024/9/29 11:40:00

一:自定义序列类

1、序列类型的分类

容器序列: list 、 tuple、deque
扁平序列: str 、bytes、bytearray、arry.array
可变序列: list 、deque、bytearray、array
不可变: str、tuple、bytes
容器序列表示可以放置任意类型的数据。
扁平序列要求存储的数据类型一致

2、list中extend和append方法的区别

extend()的参数是一个可迭代序列,会进行for循环

a = [1,2]
a.extend([3,4])
print(a)

输出结果:

[1, 2, 3, 4]

append()的参数是一个可迭代序列,会把整个序列当做一个整体添加进去。
输出结果:

[1, 2, [3, 4]]

3、切片

切片操作都会返回一个新的列表

模式[start: end: step]

其中,第一个数字start表示切片开始位置,默认为0 ;
第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
第三个数字step表示切片的步长(默认为1)。
当start为0时可以省略,当end为列表长度时可以省略,
当step为1时可以省略,并且省略步长时可以同时省略最后一个冒号。
另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行

aList = [3,4,5,6,7,9,11,13,15,17]
aList[::]   #返回包含原列表中所有元素的新列表
aList[::-1]    #返回包含原列表中所有元素的逆序列表
print(aList[ ::2])    #隔一个取一个,获取偶数位置的元素
print(aList[1::2])    #隔一个取一个,获取奇数位置的元素
print(aList[3:6])     #指定切片的开始和结束位置
aList[0:100]        #切片结束位置大于列表长度时,从列表尾部截断
aList[100:]        #切片开始位置大于列表长度时,返回空列表
alist[len(aList):] = [9]        #在列表尾部增加元素
aList[:0] = [1,2]              #在列表头部插入元素
alist[3:3] = [4]       #在列表中间位置插入元素
aList[:3] = [1,2]      #替换列表元素,等号两边的列表长度相等
aList[3:] = [4,5,6]    #等号两边的列表长度也可以不相等

下面来定义一个类,并且实现切片操作,并且是一个不可修改的序列

#--coding:utf-8--
import numbers
class Group:
    """
    实现支持切片操作,并且是一个不可修改的序列
    """
    def __init__(self,group_name,company_name,staffs):
        """
        :param group_name: 小组名称
        :param company_name: 小组所在的公司名称
        :param staffs: 组员列表,希望是一个数组
        """
        self.group_name = group_name
        self.company_name = company_name
        self.staffs = staffs

    def __getitem__(self, item):
        """
        是实现切片的关键,希望切片之后还是一个Group
        :param item:
        :return:
        """
        cls = type(self)
        if isinstance(item,slice):
            return cls(group_name=self.group_name,company_name=self.company_name,staffs=self.staffs[item])
        elif isinstance(item,numbers.Integral):
            return cls(group_name=self.group_name,company_name=self.company_name,staffs=[self.staffs[item]])

    def __len__(self):
        return len(self.staffs)

    def __iter__(self):
        return iter(self.staffs)

    def __contains__(self, item):
        if item in self.staffs:
            return True
        else:
            return False
if __name__ == '__main__':
    staff = ["网三","景天","雪剑"]
    cgroup = Group(group_name="研发1组",company_name="中南科技",staffs=staff)
    # sub = cgroup[:2]
    # sub2 = cgroup[0]
    # print(cgroup[:2])
    # print(cgroup[0])
    print(len(cgroup))
    if "景天" in cgroup:
        print("yes")
    for user in cgroup:
        print(user)

4、bisect维护已排序序列

bisect 用来处理已排序的序列,用来维持已排序的序列,升序
使用的二分查找,效率高,案例如下:

import bisect
inter_list = []
bisect.insort(inter_list,3)
bisect.insort(inter_list,1)
bisect.insort(inter_list,5)
bisect.insort(inter_list,4)
print(inter_list)

输出:

[1, 3, 4, 5]

5、array

array 是一个数组,array和list的一个重要区别,array只能存放指定的数据类型,他的效率比list高

import  array
my_array = array.array("i")
my_array.append(2)
my_array.append(3)
print(my_array)

array需要一个参数来指定数据库类型,下表是支持的数据类型。
在这里插入图片描述

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

  • 列表推导式

列表推导式也就是列表生成式,他可以简化代码

列表生成式(列表推导式)
#1、提取出1-20之间的奇数,普通写法
odd_list = []
for i in range(21):
    if i%2 ==1:
        odd_list.append(i)

#2、使用列表生成式,会简单很多
odd_list = [i for i in range(21) if i%2==1 ]

#3、如果要实现逻辑复杂的情况,可以定义一个方法
def hadle_item(item):
    return item*item

odd_list = [hadle_item(i) for i in range(21) if i%2==1]
print(odd_list)
  • 生成器表达式
    生成器表达式,将方括号改成圆括号,生成的是一个generator的生成器
odd_gen = (i for i in range(21) if i%2==1 )
print(odd_gen)
#生成器可以通过for循环查看
for i in odd_gen:
    print(i)
#可以通过list转换成list类型
odd_list = list(odd_gen)
print(type(odd_list))

输出结果:

<generator object <genexpr> at 0x0000026B29C907C8>
1
3
5
7
9
11
13
15
17
19
<class 'list'>
  • 字典推导式
#字典推导式
my_dict = {"hanory":20,"tomy":17,"marry":28}
#要把my_dict的key和value的值交换
reversed_dict = {value:key for key,value in my_dict.items()}
print(reversed_dict)

输出结果:

<class 'list'>
{20: 'hanory', 17: 'tomy', 28: 'marry'}
  • 集合推导式
my_dict = {"hanory":20,"tomy":17,"marry":28}
my_set = {key for key,value in my_dict.items()}
print(type(my_set))
print(my_set)

输出结果:

<class 'set'>
{'tomy', 'marry', 'hanory'}

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

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

相关文章

计算机中CPU、内存、缓存的关系

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 内存&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 缓存&#xff08;Cache&#xff09; CPU、内存和缓存之间有着密切的关系&#xff0c;它们共同构成了计算机系统的核…

软考高级系统架构设计师(八) 基于中间件的开发实际项目

目录 中间件的用途 中间件技术 中间件的特点 中间件的十大优越性 企业应用集成 轻量级架构 Struts框架 spring Hibernate 实际项目举例 产品逻辑大图 gRPC的接口规范 关键中间件交互 整体架构设计 大数据素材底层处理 业务交互大图 底层数据素材加工大图 中间…

这些年你走了多少弯路?接口性能测试你真的懂了?进阶测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试关注 响…

java + opencv对比图片不同

1&#xff0c;去官网下载opencv&#xff0c;下载的时候需要注册一个 Oracle 账户&#xff0c;分分钟就能注册。然后安装。我下的是4.7的。 2&#xff0c;找到jar包放进项目里 3&#xff0c;项目结构&#xff0c;比较简单 4&#xff0c;把下载的文件放进C盘 5&#xff0c;主类代…

未来独角兽!安全狗入选2023年福建省数字经济核心产业领域创新企业名单

近日&#xff0c;福建省数字福建建设领导小组办公室公布了入选2023年全省数字经济核心产业领域创新企业名单。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合安全能力入选名单&#xff0c;荣膺“未来独角兽”称号。 厦门服云信息科技有限公司&#xff08;品牌名&#…

7DGroup性能实施项目日记4

经过了一个十一假期&#xff0c;我们的日记虽然没有更新&#xff0c;但我们的项目并没有停止。 虽然这个项目是一个依托性能培训的项目&#xff0c;但对我来说&#xff0c;这和真实的项目并无二致。我们花了几万&#xff08;根据一期的培训&#xff0c;估计在3万-4万左右&…

高速电路设计系列分享-基本概念

目录 概要 整体架构流程 技术名词解释 1.带宽的理解 2.了解转换器的精度 技术细节 小结 概要 提示&#xff1a;这里可以添加技术概要 本文主要熟悉一些基本概念。随笔&#xff0c;加一些网上用语&#xff0c;只做学习之用&#xff0c;不用深入分析。 整体架构流程 提…

最佳的SCADA软件推荐

前言 发现优化工业运营效率并最大化投资回报率的最佳“监控和数据采集 &#xff08;SCADA&#xff09;、工业物联网 &#xff08;IIoT&#xff09;、人工智能 &#xff08;AI&#xff09; 等”数字化转型技术&#xff0c;使商业组织能够提高运营效率并促进公用事业管理。当配备…

浏览器插件开发(一)入门之自制屏蔽某度广告的插件

一&#xff1a;浏览器扩展介绍&#xff1a; 浏览器扩展是一个小软件定义模块的网页浏览器&#xff0c;通常称为浏览器插件&#xff0c;大部分浏览器允许安装拓展&#xff0c;其作用有用户界面修改&#xff0c;广告拦截和Cookie管理等 包含基本平台信息的应用程序清单JSON文件 …

第十章 总结【编译原理】

第十章 总结【编译原理】 前言推荐第十章 总结10.1 概述10.2 局部优化10.2.1基本块及流图10.2.2基本块的DAG表示及其应用 10.3 循环优化*10.4数据流分析 最后 前言 2023-6-26 18:54:31 以下内容源自《【编译原理】》 仅供学习交流使用 推荐 第九章 总结及作业&#xff08;4…

态路小课堂丨三种实现光模块更高传输速率的技术你知道吗?

TARLUZ态路 随着云计算、大数据的快速兴起&#xff0c;数据中心以及电信运营商对光模块的传输速率要求越来越高。从1998年发展至今&#xff0c;光模块一直朝着更高的速率、更小的封装不断升级。光模块一般采用增加波长数、增加信号传输通道数量和提高单通道速率技术方案实现光模…

公众号内添加投票链接制作投票的软件网络投票器

手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。 现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作效率&#xff0c;提高活动的影响力。 那么微信做投票的小程序哪个比较…

.vm文件发邮件时js未生效,无法控制显示隐藏

需求起因 最近在做一个发邮件的功能&#xff0c;是后端发邮件&#xff0c;不过邮件内容是由前端来写。 邮件内容包括姓名、手机号、邮箱&#xff0c;这三个参数都是不一定有的&#xff0c;如果没有某个参数时&#xff0c;那一行内容就不显示。 写法没错&#xff0c;但就是js…

npm详解

1.npm支持多个源&#xff08;没列全&#xff0c;有兴趣的可以自己去了解一下其他源&#xff09; &#xff08;1&#xff09;官方源&#xff1a;https://registry.npmjs.org &#xff08;2&#xff09;淘宝源&#xff1a;https://registry.npm.taobao.org &#xff08;3&#x…

《Java核心卷1》慢慢啃!读第3,4章 | 第12版

提醒&#xff1a;全文约6000字&#xff0c;是一份比较单纯的学习笔记&#xff0c;知识点基本采用条目的形式列出&#xff0c;起到查漏补缺和备忘录的作用&#xff0c;而对内容之间的逻辑结构并未进行仔细梳理。本文内容包括&#xff1a; Java的基本程序设计结构面向对象程序设计…

jmeter压力测试实战分析详解,一定要看完哦

目录 1.从压力测试说起 2.压力测试到底要关注什么 3.你想要的到底是个什么东西 4.面试总问的jvm调优到底是要干什么 5.常用的压力测试工具及命令 6.性能诊断到底难在哪里&#xff1f; 7.到底是加机器还是优化服务&#xff1f; 总结&#xff1a; 1.从压力测试说起 压力测…

59 KVM Skylark虚拟机混部-概述、架构及特性

文章目录 59 KVM Skylark虚拟机混部-概述、架构及特性59.1 Skylark概述59.1.1 问题背景59.1.2 总体介绍 59.2 架构及特性59.2.1 总体实现框架59.2.2 功耗干扰控制59.2.3 LLC/MB干扰控制59.2.4 CPU干扰控制 59 KVM Skylark虚拟机混部-概述、架构及特性 59.1 Skylark概述 59.1.…

Android SPI

1.SPI SPI全称Service Provider Interface&#xff0c;服务提供方接口&#xff0c;是Java提供的一套用来被第三方实现或者扩展的API&#xff0c;它可以用来启用框架扩展和替换组件。服务通常指一个接口或者一个抽象类&#xff0c;服务提供方是对这个接口或者抽象类的具体实现&…

kafka常见问题

1.为什么要用mq&#xff08;mq的作用&#xff09;&#xff1f; 2.引入mq会多哪些问题&#xff1f; 3. 如何解决这些问题&#xff1f; 1.1实现异步发送 有些复杂的业务系统&#xff0c;一次用户请求可能会同步调用N个系统的接口&#xff0c;需要等待所有的接口都返回了&#…

虹科分享 | 高考大数据可视化志愿填报分析-基于虹科Domo BI工具

高考是中国教育系统中一项极为重要的考试&#xff0c;它不仅是学生完成高中学业的重要标志&#xff0c;也是进入大学的门槛。每年高考都会吸引数百万学生参加&#xff0c;同时也吸引了各地高校和招生部门的关注。高考招生数据是教育研究和政策制定的重要依据&#xff0c;通过对…