[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)

  

posted @ 2019-03-24 21:26  Alimy  阅读(544)  评论(0编辑  收藏  举报