ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[流畅的Python]第一章数据模型

2021-10-22 07:31:42  阅读:185  来源: 互联网

标签:__ deck Python self 第一章 数据模型 suit print card


这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣

这一章介绍了 怎么样去视线一个带有python风格的纸牌类

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2021/10/20 9:51 下午
# @Author  : Waff1e
# @Email   : ox01024@163.com
# @File    : zhipai.py

import  collections
# Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:
# 1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
# 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
# 3.Counter: 计数器,主要用来计数
# 4.OrderedDict: 有序字典
# 5.defaultdict: 带有默认值的字典

from random import choice
# 返回一个列表,元组或字符串的随机项。



# Card扑克 rank点数 suit花色  namedtuple具有字典特性的元组
Card = collections.namedtuple('Card',['rank','suit'])

# 纸牌类
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]
     def __len__(self):
         return len(self._cards)
     def __getitem__(self,position):
         return self._cards[position]
     # 如果一个集合类型没有实现__contains__方法那么in运算会做一次迭代搜索
# 自定义类FrenchDeck继承object类但是功能却不是由继承而来的而是魔法参数带来的,即魔法函数是独立在object类意外的 要使用魔法参数不需要继承任何类
# 也就是在自定义类时不用继承某个类 才有某种python的特性 而是可以根据需要吧魔法函数写在自定义的类当中 使得自定义的类具有python特性







# if __name__ == '__main__':
#     # 生成扑克实例
#     deck = FrenchDeck()
#     # __getitem__方法提供的访问  仅通过__getitem__这一摞牌就变成可迭代的了
#     # print(deck[1],deck[-1])
#     # __len__方法提供的访问
#     # print(len(deck))
#     # # 使用choice函数随机抽取一张卡牌
#     # print(choice(deck))
#     # # 仅通过__getitem__这一摞牌就变成可迭代的了
#     # for card in deck:
#     #     print(card)
#     # # 反向迭代当然也是没有问题
#     # for card in reversed(deck):
#     #     print(card)
#     # 如果一个集合类型没有实现__contains__方法那么in运算会做一次迭代搜索
#     print(Card('Q','spades') in deck)

if __name__ == '__main__':
    # 生成实例对象
    deck=FrenchDeck()
    # 花色对应点数字典
    suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)
    # 获取卡牌实际点数
    def spades_high(card):
        # 点数值
        rank_value=FrenchDeck.ranks.index(card.rank)
        # 返回 卡牌的值=点数值*一共有几个花色(步进因为两个点数相邻且花色相同的卡牌实际点数相差为4)+花色的值
        return rank_value * len(suit_values)+suit_values[card.suit]
    #           通过spades_high 对卡牌排序
    for card in sorted(deck,key=spades_high):
        print(card)

    # 按照目前的设计FrenchDeck()是不能洗牌的除非对_cards进行操作 第十一章会讲到只需要一行代码来实现__setitem__方法就可以了

标签:__,deck,Python,self,第一章,数据模型,suit,print,card
来源: https://www.cnblogs.com/Waffle/p/15437017.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有