序列协议

2020 年 06 月 04 日 • 阅读数: 142

自定义序列类

序列类型的分类

  • 容器序列(可以存放任意类型的数据):list、tuple、deque
  • 扁平序列(只能存放同一种数据类型):str、bytes、bytearray、array.array
  • 可变序列:list、deque、bytearray、array
  • 不可变序列:str、tuple、bytes

序列的abc继承关系

MutableSequence.png

实现可切片对象

  • 实现一个不可变长度的对象
  • 其中实现切片的关键是__getitem__这个魔法方法
import numbers
class Group:
    def __init__(self,group_name,company_name,staffs):
        self.group_name = group_name
        self.company_name = company_name
        self.staffs = staffs
        
    def __reversed__(self):
        self.staffs.reverse()
    
    def __getitem__(self,item):
        cls = type(self)
        if isinstance(item,slice):
            return cls(group_name=self.group_name,
                       company_name=self.company_name,
                       staffs=staffs[item])
        elif isinstance(item,numbers.Integral):
            return cls(group_name=self.group_name,
                       company_name=self.company_name,
                       staffs=[staffs[item]])
    def __repr__(self):
        return ','.join(self.staffs)
    
    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
staffs = ['ly','wmm','wjl','zxy']
group = Group(company_name='nx',group_name='user',staffs=staffs)
group[:2]
ly,wmm
len(group)
4
for item in group:
    print(item)
ly
wmm
wjl
zxy
'ly' in group
True
reversed(group)
group
zxy,wjl,wmm,ly

bisect模块

  • 用来维持已排序的序列的,可以插入一个数据使序列依然有序
  • 使用二分查找的方式查找
import bisect
inter_list = []
bisect.insort(inter_list,3)
bisect.insort(inter_list,2)
bisect.insort(inter_list,5)
bisect.insort(inter_list,1)
bisect.insort(inter_list,6)
inter_list
[1, 2, 3, 5, 6]
bisect.bisect(inter_list,3)
3

array

  • array和list相比需要指定数据类型
  • 但array的性能比list高很多
import array
arr = array.array('i')
arr.append(1)
arr.extend([2,3,4,5])
arr
array('i', [1, 2, 3, 4, 5])

列表生成式

  • 性能高于一般的列表操作
  • 适用于处理逻辑不是太复杂的情况
[i**2 for i in range(21) if i%2 == 1]
[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]

生成器表达式

odd_gen = (i**2 for i in range(21) if i%2 == 1)
for item in odd_gen:
    print(item,end=' ')
1 9 25 49 81 121 169 225 289 361 

字典推导式

my_dict = {'wmm':22,'wjl':21,'zxy':20}
rev_dice = {value:key for key,value in my_dict.items()}
print(my_dict)
print(rev_dice)
{'wmm': 22, 'wjl': 21, 'zxy': 20}
{22: 'wmm', 21: 'wjl', 20: 'zxy'}

集合推导式

my_set = {key for key,value in rev_dice.items()}
print(type(my_set),my_set)
<class 'set'> {20, 21, 22}
标签: Python协议
添加评论
评论列表
没有更多内容