zoukankan      html  css  js  c++  java
  • [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)
    

      

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    P1144 最短路计数
    P2966 [USACO09DEC]牛收费路径Cow Toll Paths
    P2419 [USACO08JAN]牛大赛Cow Contest
    P1462 通往奥格瑞玛的道路
    P1346 电车
    P1339 [USACO09OCT]热浪Heat Wave
    P1418 选点问题
    P1330 封锁阳光大学
    P1182 数列分段Section II
    P2661 信息传递
  • 原文地址:https://www.cnblogs.com/alimy/p/10590520.html
Copyright © 2011-2022 走看看