2. 倒推法:从4色牌都排好开始,(有指导的)随机进行反向的操作,最后得到牌局。倒推的步数多则难,反之则易。
3. 随机生成+机器检查。先自动检查生成的牌局,知道所有牌的情况下应该不难。做这个的时候,说不定你还能得到有解的充分/必要条件,然后就容易了。
在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中是怎么描述的:
1、__str__,只有打印单个对象有效,比如:print(对象1),
__repr__() ,打印列表中的对象也有效,比如:print([对象1,对象2,对象3])
2、就是一个嵌套的推导式
3、84-90合并一下,更容易理解
就是一个列表的排序