【python】魔法方法 :__getitem__ 、 __len__、__setitem__等的使用

【python】魔法方法 :__getitem__ 、 __len__、__setitem__等的使用,第1张

在Python中,如果我们想实现创建类似于序列和映射的类(可以迭代以及通过[下标]返回元素),可以通过重写魔法方法 __getitem__、__setitem__、__delitem__、__len__ 方法去模拟。

__getitem__(self,key): 返回键对应的值。

__setitem__(self,key,value): 设置给定键的值

__delitem__(self,key): 删除给定键对应的元素。

__len__(): 返回元素的数量

【注释】只要实现了 __getitem__ 和 __len__ 方法,就会被认为是序列。

这些魔术方法的原理就是:当我们对类的属性item进行下标的 *** 作时,首先会被 __getitem__()、__setitem__()、__delitem__() 拦截,从而执行我们在方法中设定的 *** 作,如赋值,修改内容,删除内容等等。

这个方法应该以与键相关联的方式存储值,以便之后能够使用 __setitem__ 来获取。当然,这个对象可变时才需要实现这个方法。

举个栗子:

定义一副扑克牌(不包括大小王),对牌进行洗牌,然后发牌。

Output:

【注意】 :我们会发现output中,输出了: slice(1, 3, None) ,下面给出解释。

语法:

参数说明:

slice() 函数实现切片对象,主要用在切片 *** 作函数里的参数传递。

举两个栗子来看看:

Output:

切片原理

output

(程序员必会的 hhhhh.....)

看看slice在python3.7中是怎么描述的:

今天下午,成长群的群主申总提出,群里每个人找一个战友,互帮互助。一石激起千层浪,群里面积极向上好青年们就开始踊跃自我介绍,一个比一个优秀,让人羡慕不已。我正想要参与其中,突然想到我的活学活用系列需要更新了。没有困难,创造困难也要上。于是,仔细想一想,可能出现几种情况:

如果用Python来随机配对,能解决上面的问题。还有一个好处,每个月初,有了新的成员加进来之后,可以重新打乱配对一次,这样每个月都会有一个新的战友配对,就可以结交一个新朋友,岂不更好。

把全体群成员放在一个集合里面,然后随机的从这个集合中挑出两个元素,作为一对战友,然后把这俩哥们从集合中删除,剩下的成员组成了新的集合,再对新的集合重复上面的 *** 作,一直到新的集合为空,程序结束

在Python中可以用list或者set来实现

set和list的区别如下:

set是无序的,不可重复的

list是有序的,可以重复的

直觉上set比较适合,于是查看set的文档,看有没有适合的 *** 作函数。发现set的 *** 作函数有5个:

其中pop()从集合中删除并返回随机的一个元素,好像很符合我的要求,于是动手尝试。

输入的结果如下:

成功了O(∩_∩)O哈哈~

PS:因为可能存在成员数为单数的情况,为了不使程序出错,这里添加了一个try-except

上面是用set实现的,那用list能实现吗?

答案是:可以

查看Python文档,发现一个函数非常适合:random.shuffle,这个家伙能把一个list中的成员洗牌打乱,那么我们就可以按照顺序把大乱以后的list中的成员打印出来,挨着的两个成员就成为战友。实现如下:

输入的结果如下:

成功,而且不会因为单数问题报错,实现起来也比set简单,更重要的一点是程序运行后生成了一个雷暴members保存了所有的战友匹配信息。方便保存。

这里有个知识点是list的切片,list[i:j]返回的是一个小list,是原来list的第i个元素到第j个元素。

如果要应用到群成员配对,只需要把members的内容替换成为愿意程序配对的群成员们就可以啦

set创建和pop()函数

list创建,list切片

random.shuffle(list)给list洗牌

应该是这句代码:

def getPuk(x):

return getColor(x) + getValue(x)

把 return getColor(x) + getValue(x) 改成 return getColor(x),getValue(x)试试


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11555669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存