这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣
这一章介绍了 怎么样去视线一个带有python风格的纸牌类
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2021/10/20 9:51 下午 # @Author : Waff1e # @Email : ox01024@163.com # @File : zhipai.py import collections # Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型: # 1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类 # 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 # 3.Counter: 计数器,主要用来计数 # 4.OrderedDict: 有序字典 # 5.defaultdict: 带有默认值的字典 from random import choice # 返回一个列表,元组或字符串的随机项。 # Card扑克 rank点数 suit花色 namedtuple具有字典特性的元组 Card = collections.namedtuple('Card',['rank','suit']) # 纸牌类 class FrenchDeck: # 点数列表 ranks = [str(n) for n in range(2,11)]+list('JQKA') # 花色列表 suits = 'spades diamonds clubs hearts'.split(' ') def __init__(self): self._cards=[Card(rank,suit) for suit in self.suits for rank in self.ranks] def __len__(self): return len(self._cards) def __getitem__(self,position): return self._cards[position] # 如果一个集合类型没有实现__contains__方法那么in运算会做一次迭代搜索 # 自定义类FrenchDeck继承object类但是功能却不是由继承而来的而是魔法参数带来的,即魔法函数是独立在object类意外的 要使用魔法参数不需要继承任何类 # 也就是在自定义类时不用继承某个类 才有某种python的特性 而是可以根据需要吧魔法函数写在自定义的类当中 使得自定义的类具有python特性 # if __name__ == '__main__': # # 生成扑克实例 # deck = FrenchDeck() # # __getitem__方法提供的访问 仅通过__getitem__这一摞牌就变成可迭代的了 # # print(deck[1],deck[-1]) # # __len__方法提供的访问 # # print(len(deck)) # # # 使用choice函数随机抽取一张卡牌 # # print(choice(deck)) # # # 仅通过__getitem__这一摞牌就变成可迭代的了 # # for card in deck: # # print(card) # # # 反向迭代当然也是没有问题 # # for card in reversed(deck): # # print(card) # # 如果一个集合类型没有实现__contains__方法那么in运算会做一次迭代搜索 # print(Card('Q','spades') in deck) if __name__ == '__main__': # 生成实例对象 deck=FrenchDeck() # 花色对应点数字典 suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0) # 获取卡牌实际点数 def spades_high(card): # 点数值 rank_value=FrenchDeck.ranks.index(card.rank) # 返回 卡牌的值=点数值*一共有几个花色(步进因为两个点数相邻且花色相同的卡牌实际点数相差为4)+花色的值 return rank_value * len(suit_values)+suit_values[card.suit] # 通过spades_high 对卡牌排序 for card in sorted(deck,key=spades_high): print(card) # 按照目前的设计FrenchDeck()是不能洗牌的除非对_cards进行操作 第十一章会讲到只需要一行代码来实现__setitem__方法就可以了