python3.6環境
import collections from random import choice Card=collections.namedtuple('Card',['rank','suit']) class FrenchDeck: ranks=[str(n) for n in range(2,11)] +list('JQKA') #撲克的大小范圍 print(ranks) suits='spades diamods clubs hearts'.split() # 黑桃,鑽石,方塊,紅心 print(suits) 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] beer_card=Card('7','diamonds') #實例一個撲克點 print(beer_card) deck= FrenchDeck() #創一個撲克對象deck print(len(deck)) #打印總共有多少張撲克 print(deck[0]) #打印第一張牌 黑桃2 print(deck[-1]) #打印最后一張牌 紅心A print(choice(deck)) #隨機抽取一張牌 print(deck[:3]) #查看最上面三張 黑桃 2 ,3, 4 print(deck[12::13]) #抽取索引為12的那張牌,然后每隔13張在抽取一張 正好是4個A # 實現了 __getitem__方法,這一摞牌變成了可迭代對象 for card in deck: print(card) print('===============================下面是反響迭代===============================') #反向迭代 for card in reversed(deck): print(card) #判斷某張牌實例是否存在這副牌中 print(Card('Q','hearts') in deck) #True print(Card('7','beasts') in deck) #False # 比較撲克牌的大小2 最小、A 最大;同時還要加 # 上對花色的判定,黑桃最大、紅桃次之、方塊再次、梅花最小。 # 下面就是按照這個規則來給撲克牌排序的函數,梅花 2 的大小是 0,黑桃 A 是 51: suit_values=dict(spades=3,hearts=2,diamods=1,clubs=0) def spades_high(card):
# 獲取撲克的點數 rank_value = FrenchDeck.ranks.index(card.rank)
# 根據傳入的牌的實例返回撲克0-51 之間的一個索引 例 黑桃A:12*4+3=51 return rank_value * len(suit_values) + suit_values[card.suit] # 通過上面定義的函數對這幅牌進行 升序排序 print('===============================自定義排序===============================') for card in sorted(deck, key=spades_high): print(card)