1. 程式人生 > 其它 >Python簡單實現一副撲克牌

Python簡單實現一副撲克牌

技術標籤:python隨~python列表資料探勘

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