zoukankan      html  css  js  c++  java
  • 流畅的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__为迭代魔法方法,在实列化对象后,实例化出的对象可迭代

    # 实列化对象 deck
    deck = 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解释器调用,我们不用调用。

        魔术方法使用得当,加快效率。

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

        

        

  • 相关阅读:
    Mac 安装brew的正确姿势
    Jmeter分布式压测及踩坑记录
    Jmeter录制脚本
    mitmproxy使用详解
    Python单元测试框架pytest常用测试报告类型
    基于Java+Spring Boot开源项目JeeSite的Jenkins持续交付介绍
    Maven入门
    Linux Shell 编程基础详解——吐血整理,墙裂推荐!
    使用Jenkins+Blue Ocean 持续构建自动化部署之安卓源码打包、测试、邮件通知
    使用Jenkins+Pipline 持续构建自动化部署之安卓源码打包、测试、邮件通知
  • 原文地址:https://www.cnblogs.com/coylee/p/10678902.html
Copyright © 2011-2022 走看看