python自定义序列类深入学习

一:自定义序列类

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'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javascript_good

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值