import collections
from random import choice
Card = collections.namedtuple('Card','rank,suit')#namedtuple创建一个
#只有少数属性没有方法的对象
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]#先循环花色后数字
#类FrenchDeck的实例已被创建就会拥有属性_card,该属性是一个list,list中的元素都是有名元组,这些元组都是由
#collections,namedtuple('Card','rank,suit')生成的。在向这个生成器传入参数时,运用了遍历操作。
def __len__(self):
return len(self._cards)
def __getitem__(self,position):
return self._cards[position]
deck = FrenchDeck()
#print(len(deck))纸牌个数
#print(deck[0])第一张纸牌
#print(choice(deck))随机抽取一张纸牌
#print(deck[:3])查看前三张
#for card in deck:#__getiter__ 使这一摞牌变为可迭代的了
# print(card)
#for card in reversed(deck):#也可以反向迭代
# print(card)
#print(Card('Q','spades') in deck)#隐式迭代
suit_values = dict(spades=3,hearts=2,diamonds=1,clubs=0)#花色赋值
def spades_high(card):
rank_value = FrenchDeck.ranks.index(card.rank)
#通过类名调用类属性FrenchDeck.ranks找出rank的索引
#在实例deck里面,每个元素都是一个有名tuple,我们获取这个tuple的属性rank,即得到了扑克牌的点数。
#然后用index函数得到了点数在列表FrenchDeck.ranks中对应的索引,并把它作为扑克牌排序的依据之一赋值给rank_value
return rank_value * len(suit_values) + suit_values[card.suit]
#suit_values[card,suit]就是花色在suit_values中对应的值
#len(suit_values)就是4
#rank_value*4,也就是扑克牌的索引乘以四
for card in sorted(deck, key=spades_high): #deck是要进行排序的iterable,key=spades_high是排序依据
print(card)
# 这里的排序依据是一个函数,那么肯定是这样的:
# 将iterable的每一个元素作为参数传入这个函数,得到int类型的返回值,根据这个返回值来进行排序。
# 由此可推测,在spade_high函数体里的card其实是可迭代对象deck的元素。
# sorted接受两个参数
# arg1是需要进行排序的iterable
# arg2是一个函数,这个函数应该满足以下条件
# 参数是iterable arg1的element
# 返回值是element通过某种法则得到的int