Python簡單實現一副撲克牌
阿新 • • 發佈:2021-02-19
Python實現資料模型一副撲克牌
一、首先我們寫類
import collections
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 rank in self.ranks for suit in self.suits]
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()
print(len(deck))
print(deck[0])
可以用len()函式來檢視一副牌有多少張
從一副牌中抽取特定的一張紙牌,比如說第一張或最後一張,是很容易的:deck[0]或deck[-1],這都是由__getitem__方法提供的。
二、隨機選牌
如果我們需要隨機選出三張牌,我們就用random.choice就行,直接加進去就行
deck = FrenchDeck()
from random import choice
for i in range(3):
print(choice(deck))
三、其他操作
因為__getitem__方法把【】操作交給了self._cards列表,所以我們的deck類自動支援切片(slicing)操作。下面我們列出檢視一副牌中最上面3張和只看牌面是A的牌的操作。其中第二種操作的具體方法是,先抽取索引是12的那張牌,然後每隔13張牌拿1張:
deck = FrenchDeck( )
print(deck[:3])
[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
deck = FrenchDeck()
print(deck[12::13])
[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]
迭代通常是隱式的,譬如說一個集合型別沒有實現__contains__方法,那麼in運算子就會按順序做一次迭代搜素。於是,in運算子可以用在我們的FrenchDeck類上,因為它是可迭代的:
deck = FrenchDeck()
print(Card('Q','clubs') in deck)
print(Card('7','beasts') in deck)
True
False