zoukankan      html  css  js  c++  java
  • python-自定义一个序列

      python的序列可以包含多个元素,开发者只要实现符合序列要求的特殊方法,就可以实现自己的序列

      序列最重要的特征就是可以包含多个元素,序列有关的特使方法:

    1. __len__(self):该方法的返回值决定该序列元素的个数
    2. __getitem__(self,key):获取指定索引的对应的元素。key应该是整数值,否则会引发TypeError
    3. __contains__(self,item):判断序列是否包含元素
    4. __setitem__(self,key,value):设置指定索引对应的元素
    5. __delitem__(self,key):删除指定索引对应的元素

      问题描述:自定义一个序列,该序列按顺序包含52张扑克,分别是黑桃,红心,梅花,方块的2-A

      要求:提供序列的各种操作方法

    7 def check_key(key):           
      8     if not isinstance(key,int):raise TypeError("索引值必须是整数")
      9     if key < 0:raise IndexError("索引值必须是非负数")
     10     if key >= 52:raise IndexError("索引值不能大于%d" %52)
     11 class poker:                  
     12     def __init__(self):       
     13         #用于储存被修改的数据 
     14         self.__change = {}    
     15         #用于存储已经删除元素的索引
     16         self.__delete = []    
     17     def __len__(self):        
     18         return 52             
     19                               
     20     def __getitem__(self,key):
     21         check_key(key)        
     22         if key in self.__change:   
     23             return self.__change[key]
     24         if key in self.__delete:   
     25             return None       
     26         ret = ""              
     27         i = key // 13         
     28         if i == 0:            
     29             ret = "黑桃"      
     30         elif i == 1:          
     31             ret = "红心"      
     32         elif i == 2:          
     33             ret = "梅花"      
     34         else:                 
     35             ret = "方块"      
     36         i = key%13            
     37         if i < 9:             
     38             ret = ret + str(i + 2)
    39         if i == 9:   
     40             ret = ret + "J"  
     41         if i == 10:  
     42             ret = ret + "Q"  
     43         if i == 11:  
     44             ret = ret + "K"  
     45         if i == 12:  
     46             ret = ret + "A"  
     47         #根据计算返回元素列表
     48         return ret   
     49     def __setitem__(self,key,value):
     50         check_key(key)    
     51         self.__change[key] = value
     52     def __delitem__(self,key,value):
     53         check_key(key)    
     54         if key not in self.__delete:
     55             self.__delete.append(key)
     56         if key in self.__change:
     57             del self.__change[key]
     58 if __name__ == "__main__":
     59     sequece = poker()
     60     print(len(sequece))
     61     for i in sequece:
     62         print(i,end = "	")
     63     print()                            

    运行结果:

    52
    黑桃2   黑桃3   黑桃4   黑桃5   黑桃6   黑桃7   黑桃8   黑桃9   黑桃10
    黑桃J   黑桃Q   黑桃K   黑桃A   红心2   红心3   红心4   红心5   红心6
    红心7   红心8   红心9   红心10  红心J   红心Q   红心K   红心A   梅花2
    梅花3   梅花4   梅花5   梅花6   梅花7   梅花8   梅花9   梅花10  梅花J
    梅花Q   梅花K   梅花A   方块2   方块3   方块4   方块5   方块6   方块7
    方块8   方块9   方块10  方块J   方块Q   方块K   方块A

      大家可能会有疑问,该序列是如何生成序列中的所有元素的?

      该序列本身并不保存序列元素,序列会根据索引动态的计算序列元素,因此序列需要被修改和被删除的元素。该序列引用__change,__delete来保存被修改和被删除的元素。

     7 """                  
      8 自定义一个序列,该序列顺序包含所有的三位数(100,101.....999)
      9                      
     10 """                  
     11                      
     12 def check_key(key):  
     13     if not isinstance(key,int):raise TypeError("索引值必须是整数")
     14     if key < 0:raise IndexError("索引值必须是非负数")
     15     if key > 899:raise IndexError("索引值不能大于%d" %900)
     16 class third_number:  
     17     def __init__(self):
     18         #用于储存被修改的数据
     19         self.__change = {}
     20         #用于存储已经删除元素的索引
     21         self.__delete = []
     22     def __len__(self):
     23         return 900   
     24                      
     25     def __getitem__(self,key):
     26         check_key(key)
     27         if key in self.__change:
     28             return self.__change[key]
     29         if key in self.__delete:
     30             return None
     31         number = key + 100
     32         return number
     33                      
     34     def __setitem__(self,key,value):
     35         check_key(key)
     36         self.__change[key] = value
     37     def __delitem__(self,key,value):
     38         check_key(key)
    39         if key not in self.__delete:
     40             self.__delete.append(key)
     41         if key in self.__change:
     42             del self.__change[key]
     43 if __name__ == "__main__":
     44     sequece = third_number()
     45     print(len(sequece))
     46     for i in sequece:
     47         print(i,end = "	")
     48     print()          
     49     print(sequece[1])      
    笨鸟先飞
  • 相关阅读:
    ACM模板(Java)
    【HDU 6008】Worried School(模拟)
    【HDU 6005】Pandaland(Dijkstra)
    jQuery和js使用点滴
    springmvc入门(1)
    MyBatis延迟加载和缓存(4)
    MyBatis高级映射查询(3)
    教你如何下载微信公众号的音频文件
    MyBatis代理开发(2)
    MyBatis入门程序(1)
  • 原文地址:https://www.cnblogs.com/zoutingrong/p/13899440.html
Copyright © 2011-2022 走看看