一摞python风格的纸牌

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值