您好,欢迎来到花图问答。
搜索
您的当前位置:首页流畅的Python---纸牌(魔术方法:__getitem__与__len__)

流畅的Python---纸牌(魔术方法:__getitem__与__len__)

来源:花图问答
流畅的Python---纸牌(魔术⽅法:__getitem__与__len__) 常⽤Python的内建模块(collections)、魔术⽅法(__getitem__ 与 __len__ )构建纸牌

  1.常⽤内建模块 collections、base64、struct、hashlib、itertools、XML、HTMLParser

    collections集合类:namedtuple、deque、defaultdict、OrdereDict、Counter

    namedtuple是⼀个函数,创建⼀个⾃定义tuple对象,并且规定tuple元素的个数,并且可以⽤属性,⽽不是索引来引⽤tuple的某个元素

import collections

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

    根据Card 写出4种花⾊、13个数,⼀共52张纸牌----FrenchDeck类

class FrenchDeck:

ranks = [str(n) for n in range(2,11)] + list('JQKA') suits = 'spades diamods 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): return self._cards[position]

    __init__为构造函数,在实例化对象后,对象中_cards将有52张纸牌,并且是元组类型的    __len__为长度魔法⽅法,在实例化对象后,实列化出的对象可计数或者计算长度    __getitem__为迭代魔法⽅法,在实列化对象后,实例化出的对象可迭代

# 实列化对象 deckdeck = FrenchDeck()# 对象deck可计数print(len(deck))# 对象deck可迭代for card in deck: print(card)

# 对象deck可反迭代

for card in reversed(deck): print(card)

    按照常规将纸牌排序,2最⼩、A最⼤、⿊桃最⼤、红桃次之、⽅块再次、梅花最⼩

# 字典suit_values表⽰花⾊的⼤⼩

suit_values = dict(spades=3, hearts=2, diamods=1, clubs=0)def spades_high(card):

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

return rank_value * len(suit_values) + suit_values[card.suit]for card in sorted(deck,key=spades_high): print(card)

  2. 魔术⽅法(使⽤原则)  

    这些特殊⽅法都是为了被Python解释器调⽤,我们不⽤调⽤。    魔术⽅法使⽤得当,加快效率。

    很多时候这些魔术⽅法都是隐式的,⽆需直接使⽤特殊⽅法。但是在有⼤量的元编程存在时,直接调⽤特殊⽅法的频率应该远远低于我们去实现他们的次数。        

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务