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 = "\t")
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 = "\t")
48 print()
49 print(sequece[1])

最新文章

  1. Hadoop HDFS 用户指南
  2. 职业规划:管理vs技术
  3. 转:Linux内部的时钟处理机制全面剖析
  4. OpenResty 安装及使用(第一篇安装)
  5. Android讯飞语音云语音听写学习
  6. MYSQL注入天书之HTTP头部介绍
  7. 浅析console和浏览器命令行API
  8. NodeJs获取不到POST参数
  9. with 与 debugger
  10. Windows7 无法打开ASA SSL VPN和ASDM首页
  11. Qt QDebug等重定向到文件中
  12. 大约Android 了解权限管理
  13. 4月18开始看《C++Primer Plus》
  14. Ubuntu14.04安装androidStudio错误解除
  15. unable to find the sources of your current Linux kernel.
  16. 详解BarTender选项大小调整模式
  17. iOS中UIView翻转效果实现
  18. 5select的运用
  19. java jpa 报错
  20. Centos 系统Java环境安装

热门文章

  1. vue中获取元素并控制相应的dom
  2. μC/OS-III---I笔记7---消息队列
  3. GitHub Secrets All In One
  4. React Native &amp; Security
  5. js console 性能测试 &amp; don&#39;t-use-array-foreach-use-for-instead
  6. URLSearchParams &amp; GET Query String &amp; JSON
  7. 使用控制台启动Android设备模拟器
  8. NGK算力持有好处多多!SPC、VAST等免费拿!
  9. 万链互联时代,NGK DeFi项目如何在牛市中崭露头角!
  10. Docker Tips: 关于/var/run/docker.sock