[Python]小甲鱼Python视频第047课(魔法方法:定制序列) )课后题及参考解答
# -*- coding: utf-8 -*- """ Created on Sun Mar 24 20:05:57 2019 @author: fengs """ """ 测试题(笔试,不能上机哦~) 0. 你知道 Python 基于序列的三大容器类指的是什么吗? 列表 元组 字符串 1. Python 允许我们自己定制容器,如果你想要定制一个不可变的容器(像 String),你就不能定义什么方法? __setitem__() __delitem__() 2. 如果希望定制的容器支持 reversed() 内置函数,那么你应该定义什么方法? __reversed__() 3. 既然是容器,必然要提供能够查询“容量”的方法,那么请问需要定义什么方法呢? len() <------> __len__() 4. 通过定义哪些方法使得容器支持读、写和删除的操作? __getitem__() __setitem__() __delitem__() 5. 为什么小甲鱼说“在 Python 中的协议就显得不那么正式”? 协议像是指导文件,实现靠自己 """ """ 0. 根据课堂上的例子,定制一个列表,同样要求记录列表中每个元素被访问的次数。 这一次我们希望定制的列表功能更加全面一些,比如支持 append()、pop()、extend() 原生列表所拥有的方法。 你应该如何修改呢? 要求1:实现获取、设置和删除一个元素的行为(删除一个元素的时候对应的计数器也会被删除) 要求2:增加 counter(index) 方法,返回 index 参数所指定的元素记录的访问次数 要求3:实现 append()、pop()、remove()、insert()、clear() 和 reverse() 方法(重写这些方法的时候注意考虑计数器的对应改变) """ """ 课堂自定义列表 """ class CountList_ketang: def __init__(self,*args): self.values = [x for x in args] self.count = {}.fromkeys(range(len(self.values)),0) def __len__(self): return len(self.values) def __getitem__(self,key): self.count[key] += 1 return self.values[key] #a = CountList_ketang(1,2,3,4) #print(a[1]) #print(len(a)) #print(a.count) """ """ class CountList_dds0(): def __init__(self,*args): self.values = [x for x in args] self.count = {}.fromkeys(range(len(self.values)),0) #要求二:访问次数 def counter(self,index): if index < self.__len__(): return self.count[index] else: return None def __len__(self): return len(self.values) def __getitem__(self,key): if key < self.__len__(): self.count[key] += 1 return self.values[key] else: return None def __setitem__(self,key,value): if key < self.__len__(): self.values[key] = value self.count[key] += 1 else: pass def __delitem__(self,key): if key < self.__len__(): for each_key in self.count.keys(): if each_key >= key: if each_key != self.__len__() - 1: self.count[each_key] = self.count[each_key+1] else: pass del self.values[key] self.count.pop(max(self.count.keys())) else: pass def append(self,value): index = self.__len__() self.count[index] = 0; self.values.append(value) def pop(self): key = self.__len__() - 1 del self.count[key] return self.values.pop() def remove(self,key): return self.__delitem__(self,key) def insert(self,key,value): if key > self.__len__(): return None elif key == self.__len__(): return self.append(self,value) elif key < self.__len__(): self.count[self.__len__()] = 0 for each_key in range(max(self.count.keys())): print(each_key) if each_key > key: self.count[each_key] = self.count[each_key-1] self.count[key] = 0; self.values.insert(key,value) def clear(self): self.values.clear() self.count.clear() def reverse(self): self.values.reverse() length = self.__len__() for i in range(length//2): self.count[i],self.count[length-i-1] = self.count[length-i-1],self.count[i] count_list = CountList_dds0(1,2,3,4,5) print(count_list[0]) print(count_list[1]) print(count_list.count) del count_list[0] print(count_list.count) print(count_list.counter(1)) count_list.append(111) print(count_list.values) print(count_list.count) print(count_list[4]) print(count_list.counter(4)) print(count_list.pop()) print(count_list.count) print(count_list[1]) print(count_list[1]) print('---------------------') count_list.insert(1,22) print(count_list.count) print(count_list[1]) print(count_list.count) print('---------------------') print(count_list.values) print(count_list.count) count_list.reverse() print(count_list.values) print(count_list.count) print('---------------------') count_list.clear() print(count_list.count) print(count_list.values)
~不再更新,都不让我写公式,博客园太拉胯了