扑克发牌

两个下划线结尾(例如__getitem__)。比如obj[key]的背后就是__getitem__方法,为了求得my_collection[key]的值,解释器实际上会调用my_collection.__getitem__(key),双下划线这种特殊方法也叫双下方法(dunder method)
import collections

from random import choice

Card=collections.namedtuple('Card',['rank','suit'])

class FrenchDeck:

    ranks=[str(n) for n in range(2,11)] +list('JQKA') #扑克的大小范围

    print(ranks)

    suits='spades diamods clubs hearts'.split()  # 黑桃,钻石,方块,红心

    print(suits)

    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]

    beer_card=Card('7','diamonds')  #实例一个扑克点

    print(beer_card)

deck= FrenchDeck()  #创一个扑克对象deck

print(len(deck))    #打印总共有多少张扑克

print(deck[0])    #打印第一张牌 黑桃2

print(deck[-1])    #打印最后一张牌 红心A

print(choice(deck))  #随机抽取一张牌

print(deck[:3])    #查看最上面三张  黑桃 2 ,3, 4

print(deck[12::13]) #抽取索引为12的那张牌,然后每隔13张在抽取一张 正好是4个A

# 实现了 __getitem__方法,这一摞牌变成了可迭代对象

for card in deck:

    print(card)

#反向迭代

for card in reversed(deck):

    print(card)

#判断某张牌实例是否存在这副牌中

print(Card('Q','hearts') in deck)  #True

print(Card('7','beasts') in deck)  #False

#  比较扑克牌的大小2 最小、A 最大;同时还要加

#  上对花色的判定,黑桃最大、红桃次之、方块再次、梅花最小。

# 下面就是按照这个规则来给扑克牌排序的函数,梅花 2 的大小是 0,黑桃 A 是 51:

suit_values=dict(spades=3,hearts=2,diamods=1,clubs=0)

def spades_high(card):

    # 获取扑克的点数

    rank_value = FrenchDeck.ranks.index(card.rank)

    # 根据传入的牌的实例返回扑克0-51 之间的一个索引  例 黑桃A:12*4+3=51

    return rank_value * len(suit_values) + suit_values[card.suit]

# 通过上面定义的函数对这幅牌进行 升序排序

for card in sorted(deck, key=spades_high):

        print(card)

你可能感兴趣的:(扑克发牌)