记录每天学习代码的过程:
import collections
from random import choice
# 用collections.namedtuple构建一个简单的类,表示单张纸牌,使用namedtuple构建只有属性而没有自定义方法的类对象
Card = collections.namedtuple('Card', ['rank', 'suit'])
suit_values = dict(spades=3,hearts=2,diamonds=1,clubs=0)
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 suit in self.suits
for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position): # 调用方法:obj[key]
return self._cards[position]
def spades_high(card):
rank_values = FrenchDeck.ranks.index(card.rank)
return rank_values*len(suit_values) + suit_values[card.suit]
# 使用这个类表示一摞牌中的各张纸牌
beer_card = Card('7','diamonds')
print(beer_card)
# 响应len()函数,返回一摞牌有多少张
deck = FrenchDeck()
print(len(deck))
# 调用__getitem__方法,轻松从这摞牌中抽取某一张
print(deck[0])
print(deck[-1])
# 利用random.choice随机选一张牌
print(choice(deck))
# 利用切片(silcing),展示如何从一摞新牌中抽取最上面三张,再从索引12位开始,跳过13张牌9999999,只抽取4张A
print(deck[:3])
print(deck[12::13])
# 实现特殊方法__getitem__之后,这摞纸牌可以迭代
for card in deck:
print(card)
# 反向迭代
for card in reversed(deck):
print(card)
# 迭代往往是隐式的。如果容器没有实现__cintains__方法,那么in运算符就会做一次顺序扫描
print(Card('Q','hearts') in deck)
print(Card('Q','bearts') in deck)
# 实现排序
for card in sorted(deck,key=FrenchDeck.spades_high):
print(card)
参考文献
流畅的Python(第2版)