赛博扑克
用collections.namedtuple构建一个简单的类来表示一张纸牌
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
beer_card = Card('J', 'hearts')
print(beer_card)
可以得到一个纸牌对象
一摞有序的纸牌
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'hearts diamonds clubs spades'.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]
可以使用len()来查看一叠牌有多少张
deck = FrenchDeck()
print(len(deck))
抽取第一张和最后一张:
print(deck[0])
print(deck[-1])
可以使用python内置的random.choice来随机抽取一张纸牌:
from random import choice
print(choice(deck))
因为__getitem__方法把[]操作交给了self._cards列表,所以deck类自动支持切片操作(slicing)
查看一摞牌最上面3张和只看牌面是A的牌:
print(deck[:3])
# 先抽出索引是12的那张牌,然后每向后数13张牌拿一张
print(deck[12::13])
另外,仅仅实现了__getitem__方法,这一摞牌就编变成可迭代的了:
for card in deck:
print(card)
反向迭代:
for card in reversed(deck):
print(card)
扑克的排序
用点数来判定扑克牌的大小,2最小,A最大,黑桃 > 红桃 > 方块 > 梅花
那么 梅花2 = 0, 黑桃A = 51
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
def spades_high(card):
rank_value = FrenchDeck.ranks.index(card.rank)
return rank_value * len(suit_values) + suit_values[card.suit]
有了spades_high函数,就能对这摞牌进行升序排序了:
for card in sorted(deck, key=spades_high):
print(card)
······