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

你可能感兴趣的:(python随~,python,列表,数据挖掘)