python-自定义一个序列
python的序列可以包含多个元素,开发者只要实现符合序列要求的特殊方法,就可以实现自己的序列
序列最重要的特征就是可以包含多个元素,序列有关的特使方法:
- __len__(self):该方法的返回值决定该序列元素的个数
- __getitem__(self,key):获取指定索引的对应的元素。key应该是整数值,否则会引发TypeError
- __contains__(self,item):判断序列是否包含元素
- __setitem__(self,key,value):设置指定索引对应的元素
- __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])
python-自定义一个序列的更多相关文章
- Python自定义一个数组类,支持数组之间的四则运算和其他常见方法
class MyArray: '''保证输入的内容是整型.浮点型''' def ___isNumber(self, num): if not isinstance(num, (int,float)): ...
- Python展开一个嵌套的序列
摘自<Python Cookbook> 4.6 任务 序列中的子序列可能是序列,子序列的子项仍有可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一个序列,将其所有的子序列展 ...
- python的reduce函数的使用方法详解以及使用案例,相加,相乘(处理一个序列,然后把序列进程合并操作)
1.求列表的数字相加之和,还是之前的习惯,写for循环来实现 num_1=[1,2,3,4,5,6,7,8,9] a=0 for n in num_1: #a=a+n a+=n print (a) C ...
- 【循序渐进学Python】4. Python中的序列——字典
字典是Python内建的六种序列之一.字典作为一种常用的数据结构,字典中的值没有特定顺序,每个值都对应于一个唯一的键.键可以是数字.字符串甚至是元组. 1. 创建和使用字典 Python中字典可以使用 ...
- 【循序渐进学Python】2. Python中的序列——列表和元组
序列概览 在Python中有六种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.在这里暂时只讨论列表和元组.列表和元组的主要区别在于:列表可以修改,元组(不可 ...
- Python学习三---序列、列表、元组
一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...
- python高级(二)—— python内置序列类型
本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...
- Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要以下几种类型: 3种基本序列类型(Basic Sequence Types):list. ...
- Python基础:序列(列表、元组)
一.概述 列表(list)是由一个个 Python对象 组成的序列.其中,Python对象 可以是任何类型的对象,包括 Python标准类型(数值.字符串.列表.元组和字典)以及 用户自定义类型(类) ...
随机推荐
- 016.NET5_MVC_视图组件扩展定制
视图组件 1. 呈现页面响应的某一部分而不是整个响应 2. 包括在控制器和视图之间发生的关注分类和可测试优势 3.可以具有参数和业务逻辑 4. 通常在页面局部调用 如何自定义视图组件? 1.Razor ...
- keras自定义网络层
在深度学习领域,Keras是一个高度封装的库并被广泛应用,可以通过调用其内置网络模块(各种网络层)实现针对性的模型结构:当所需要的网络层功能不被包含时,则需要通过自定义网络层或模型实现. 如何在ker ...
- Google Developer Profile
Google Developer Profile https://google.dev/u/me https://google.dev/u/109030792841960772125 Google D ...
- webpack 5 模块联合
webpack 5 模块联合 webpack 5 https://webpack.docschina.org/concepts/module-federation/ https://github.co ...
- SQL All In One
SQL All In One Structured Query Language SQL is an ANSI (American National Standards Institute) stan ...
- macOS 升级后导致 dart bug
macOS 升级后导致 dart bug macOS 10.15.5 $ demo_app git:(master) flutter doctor # /Users/xgqfrms-mbp/Docum ...
- js 如何取消promise
1: 使用reject function hello() { let _res, _rej: any; const promise = new Promise((res, rej) => { _ ...
- java对象克隆复制
原文链接:https://blog.csdn.net/ztchun/article/details/79110096 自己先简单描述总结一下:当想要将一个对象中已有的值直接给另外一个对象的时候,其实并 ...
- COM技术中的VARIANT and VARIANTARG
VARIANT and VARIANTARG Use VARIANTARG to describe arguments passed within DISPPARAMS, and VARIANT to ...
- 音视频+ffmpeg
雷霄骅:https://me.csdn.net/leixiaohua1020 致敬! 1.[总结]视音频编解码技术零基础学习方法 https://blog.csdn.net/leixiaohua102 ...