作为一个python初学者,最近在看《流畅的python》一书,在书的第一章遇到了一个很有意思的小例子:在同时考虑一副扑克牌数字大小和花色的同时,如何尽可能简单的判断任意两张牌的大小?(没有大小鬼牌,牌的大小优先于花色大小)
一般来说,最先想到的办法当然是两层逻辑:
-
先比较数字大小
-
再比较花色大小
这样的两层逻辑,数字不同得比一次,数字相同则得比两次,而且数字和花色属于不同类型的数据,不够简洁,怎么办呢?先统一数据类型的话,我们可以设定黑桃为3,梅花为2,红桃为1,方片为0(为什么设置成这几个数后面会讲到),这时再按上面的步骤就变成了比较两次数字的大小,算是简化了一些。
但是这还是两层逻辑,其本质并没有改变,所以若想做出关键革新,我们还需要再挖掘它的内在规律。
这就是扑克牌的大小关系图,每行数字相同,每列花色相同,按红色箭头轨迹自小到大,聪明的你一定看出来了这其实是一个高位不进位的四进制(其实这么说也不是很严谨,但很容易理解)——高位就是扑克牌上的数字,低位就是扑克牌的花色,所以我们在设置花色数字时才是0,1,2,3,最后根据这个规律每张牌就可以换算成:高位×4+低位,比如黑桃A就是1×4+3=7,红桃3就是3×4+1=13,所以13>7,红桃3大于黑桃A。