我先给出源代码,大家看一下。
import collections
from random import choice
Card = collections.namedtuple('Card', ['rank', 'suit'])
class Deck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suit = '黑桃 红桃 方片 梅花'.split(' ')
def __init__(self):
self._card = [Card(rank, suit) for suit in self.suit for rank in self.ranks]
def __len__(self):
return len(self._card)
def __getitem__(self, index):
return self._card[index]
def __str__(self):
return str([str(x) for x in self._card])
if __name__ == '__main__':
card1 = Card('7', '红桃')
print(card1)
deck = Deck()
print(deck)
card_r = choice(deck)
print(deck[:3])
print(len(deck))
print(deck[12::13])
print(Card(rank='A', suit='方片') in deck)
Deck是我们的纸牌类,一共52张。
其中实现了len()、getitem()、str()方法。
在我们实现getitem()后发现,Deck类自动有了切片的功能,而且,它还可以迭代。
又因为迭代是隐性的,我们并没有实现contains,但是它却可以实现in运算,因为它是可迭代的。
还有就是可以注意到:
self._card = [Card(rank, suit) for suit in self.suit for rank in self.ranks]
这一句使用的就是昨天讲的列表解析语法。不过使用了两个for循环。这也是支持的,相当于两层循环。这比用循环初始化列表,要快很多。
网友评论