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标准类型(数值.字符串.列表.元组和字典)以及 用户自定义类型(类) ...
随机推荐
- codeforces 920E(非原创)
E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- JVM 报 GC Overhead limit exceeded 是什么意思?
默认情况下,并不是等堆内存耗尽,才会报 OutOfMemoryError,而是如果 JVM 觉得 GC 效率不高,也会报这个错误. 那么怎么评价 GC 效率不高呢?来看下源码: 呢?来看下源码gcOv ...
- Microsoft Lifecycle Policy
Microsoft Lifecycle Policy The Microsoft Lifecycle Policy gives you consistent and predictable guide ...
- react & redux data flow diagram
react & redux data flow diagram Redux 数据流程图
- Cookie 政策
Cookie 政策 合规/隐私协议 https://www.synology.cn/zh-cn/company/legal/cookie_policy Cookie Cookie 政策 生效日期:20 ...
- html tag filter in js
html tag filter in js const html = `可当天预订,必须21时15分之前下单,要求必须<font color=green><b>60</b ...
- py 时间处理
字符串解析 如果你使用的不是isoformat string那么解析字符串就会失败,需要用strptime转换一下 import datetime datetime.datetime.strptime ...
- Apple & HTML5 app
Apple & HTML5 app https://developer.apple.com/cn/news/?id=09062019b https://developer.apple.com/ ...
- 02.描述统计 (descriptive statistics)
1.数据的可靠性和有效性 2.利用图表对数据进行可视化 2.1分类变量的可视化 2.11无序分类变量 2.12有序分类变量的可视化 2.1数值变量的可视化 数据的分布
- call、apply和bind的实现
call方法 基础版, 只能修改指向,不能传参 Function.prototype.myCall = function(context) { // 获取调用者,这里为bar context.fn = ...