Python高级编程-自定义序列以及dict

一、序列类型分类

1、容器序列


list、tuple、deque

2、扁平序列

str、array

3、可变序列

list、deque、array

4、不可变序列

str、tuple

二、序列的abc继承关系

#"Sequence", "MutableSequence",不可变序列以及可变序列

三、序列的+ += 以及extends区别

+ 是生成一个新的对象
+= 调用isadd 本质上还是extends,对于可变类型是在修改原来对象
extend 对于可变类型是在修改原来对象,extend(可迭代对象)

四、实现可切片对象

class Group:
    def __init__(self, age):
        self.age = age

    def __getitem__(self, item):
        cls = type(self)
        if isinstance(item, Integral):
            return cls([self.age[item]])
        elif isinstance(item, slice):
            return cls(self.age[item])

五、bisect管理可排序序列

test_list = []
# left 相同的插入左边、right 相同的插入右边
index = bisect.bisect_left(test_list,3) #获取索引,不插入
bisect.insort_left(test_list,3) #插入

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

# 列表推导式
def func():
    pass
test=[fun(i) for i in range(10) if i >3]
#生成器表达式
test=(fun(i) for i in range(10) if i >3#字典推导式
test = { f"a{i}":i for i in range(10)}
#集合推导式
test = { i for i in range(10)}

七、dict常见用法

#常用方法
test_dict = {"name":"hatcher"}
#setdefault:先取key对应的值,不存在设置default
test_dict.setdefault("name":"hewitt")
# update
test_dict.update(age=12)
test_dict.update([("class",1)])
#fromkeys
dict.fromkeys(["name"],"hatcher")
#如果需要继承于dict,自定义相关功能,不要直接继承dict,因为dict底层是c实现的,继承dict来重写莫玛方法可能不生效。
#可以继承UserDict或者defaultdict
#UserDict
from collections import UserDict、defaultdict
class TestUserDict(UserDict):
def __setitem__(self,key,value):
    super().__setitem(key,value*2)
result = TestUserDict(a=1) #{"a":2}
#defaultdict
#defaultdict中重写了_missing__方法,key不存在的时候调用default_factory获取值
class TestDefaultDict(defaultdict):
    pass
res = TestDefaultDict(dict) #这里传入一个类
res["test"] #{}

八、dict、set原理

1、申请一块连续的空间
2、将key进行hash,然后&dict或者set长度、计算出偏移量,插入到连续空间中
3、hash计算可能发生冲突、此时需要解决冲突、将key往前取再进行hash操作。直到偏移量不重复
4、当空间不足三分之一的时候会重新申请更大的内存空间、将原来的全部复制到新的空间中。
随着数据量的增大、dict的查找效率一直保持高水平、比list高
数据的插入会影响数据的存储顺序
数据的插入会影响原来的数据顺序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值