定义一个纸牌类

import collections

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]

首先,我们用 collections.namedtuple 构建了一个简单的类来表示一张纸牌。自 Python 2.6 开始,namedtuple 就加入到 Python 里,用以构建只有少数属性但是没有方法的对象,比如数据库条目。如下面这个控制台会话所示,利用 namedtuple ,我们可以很轻松地得到一个纸牌对象:

>>> beer_card = Card('7', 'diamonds')

>>> beer_card

Card(rank='7', suit='diamonds')

当然,我们这个例子主要还是关注 FrenchDeck 这个类,它既短小又精悍。首先,它跟任何标准 Python 集合类型一样,可以用 len() 函数来查看一叠牌有多少张:

>>> deck = FrenchDeck()

>>> len(deck)

52

从一叠牌中抽取特定的一张纸牌,比如说第一张或最后一张,是很容易的:deck[0] 或 deck[-1] 。这都是由 getitem 方法提供的:

>>> deck[0]

Card(rank='2', suit='spades')

>>> deck[-1]

Card(rank='A', suit='hearts')

我们需要单独写一个方法用来随机抽取一张纸牌吗?没必要,Python 已经内置了从一个序列中随机选出一个元素的函数 random.choice ,我们直接把它用在这一摞纸牌实例上就好:

>>> from random import choice

>>> choice(deck)

Card(rank='3', suit='hearts')

>>> choice(deck)

Card(rank='K', suit='spades')

>>> choice(deck)

Card(rank='2', suit='clubs')

因为 getitem 方法把 [] 操作交给了 self._cards 列表,所以我们的 deck 类自动支持切片(slicing)操作。下面列出了查看一摞牌最上面 3 张和只看牌面是 A 的牌的操作。其中第二种操作的具体方法是,先抽出索引是 12 的那张牌,然后每隔 13 张牌拿 1 张:

>>> deck[:3]

[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'),

Card(rank='4', suit='spades')]

>>> deck[12::13]

[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'),

Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]

另外,仅仅实现了 getitem 方法,这一摞牌就变成可迭代的了:

>>> for card in deck: # doctest: +ELLIPSIS

... print(card)

Card(rank='2', suit='spades')

Card(rank='3', suit='spades')

Card(rank='4', suit='spades')

...

反向迭代也没关系:

>>> for card in reversed(deck): # doctest: +ELLIPSIS

... print(card)

Card(rank='A', suit='hearts')

Card(rank='K', suit='hearts')

Card(rank='Q', suit='hearts')

...

迭代通常是隐式的,譬如说一个集合类型没有实现 contains 方法,那么 in 运算符就会按顺序做一次迭代搜索。于是,in 运算符可以用在我们的 FrenchDeck 类上,因为它是可迭代的:

>>> Card('Q', 'hearts') in deck

True

>>> Card('7', 'beasts') in deck

False

那么排序呢?我们按照常规,用点数来判定扑克牌的大小,2 最小、A 最大;同时还要加上对花色的判定,黑桃最大、红桃次之、方块再次、梅花最小。下面就是按照这个规则来给扑克牌排序的函数,梅花 2 的大小是 0 ,黑桃 A 是 51 :

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

def spades_high(card):

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

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

有了 spades_high 函数,就能对这摞牌进行升序排序了:

>>> for card in sorted(deck, key=spades_high): # doctest: +ELLIPSIS

... print(card)

Card(rank='2', suit='clubs')

Card(rank='2', suit='diamonds')

Card(rank='2', suit='hearts')

... (46 cards ommitted)

Card(rank='A', suit='diamonds')

Card(rank='A', suit='hearts')

Card(rank='A', suit='spades')

python抽样不同花色纸牌_Python 数据模型 一摞Python风格的纸牌相关推荐

  1. 1-1 一摞有风格的纸牌之一摞

    写在前面 昨天学习了怎么用namedtuple()方法生成一张纸牌的类.今天继续学习怎么生成一摞纸牌. 一摞有风格的纸牌之一摞 流畅的Python中给出的第一个例子是一摞有序的纸牌: import c ...

  2. 1-1 一摞有风格的纸牌之一张纸牌

    写在前面 流畅的Python第一章的主题是讲数据模型.Python中的数据模型是指什么呢?Honestly,我也不知道. 虽然潜意识中认为所谓数据模型是指对数据的处理及构建,那具体的处理和构建方式又是 ...

  3. python的起源和发展_Python入门第一课——Python的起源、发展与前景!

    我们在做任何一件事情之前,我们都会通过各种渠道去搜集事情的信息,了解事情的来龙去脉,学习一门编程语言也是如此,只有知根知底,我们才能有明确的方向和目标,以及底气去完成这件事情,今天我带大家来看看Pyt ...

  4. python手机编译器可以干什么_Python是什么?Python学习用哪些编译器?

    Python是什么?Python是一个非常好用的程序语言,开发的速度非常快.Python的设计哲学是优雅.明确.简单.因此,Perl语言中总是有多种方法来做同一件事的理念在Python开发者中通常是难 ...

  5. 怎样下载python模块sublime text3中_python安装环境配置、python模块添加、sublime text编辑器配置...

    前提:本文讲述的是  windows环境 python相应的安装配置. 进入官网找安装包,官网地址如下:https://www.python.org/downloads/ 找到相应2.7.x或3.x版 ...

  6. python输入y继续运行_Python二三事 - 接触Python(x,y)

    注释:本文原来转自博客大巴的一篇文章,向原作者致谢!我也做了相应的修改,更加完善对于Pythonx,y的介绍 Python 二三事 面向初学者介绍Python相关的一些工具,以及可能遇到的常见问题. ...

  7. python na不显示 占位_Python学习之路—Python基础(一)

    前言 在Python学习之路-初识Python一文中,简单的介绍了Python的基本信息,搭建了Python的基础运行环境,这篇文档将主要展现一些Python的入门必备内容,如有错误或遗漏的地方,欢迎 ...

  8. python列表转化为数字信号_python 经典数字滤波实例 Python 数字信号处理程序实现分享解...

    常用的数字滤波的方法都有哪些,写出其中三种数字经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念.根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成.换句话说,就 ...

  9. python爬虫有什么好处_python为什么叫爬虫 python有什么优势

    作为一门编程语言而言,Python是纯粹的自由软件,以简洁清晰的语法和强制使用空白符进行语句缩进的特点从而深受程序员的喜爱.很多程序员都会把python叫做爬虫,那么你们知道python为什么叫爬虫吗 ...

最新文章

  1. C++文件如何在linux下生成动态库So,以及如何使用这个动态库
  2. jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法
  3. 浏览器阻挡cookies_解决WordPress登录提示”Cookies被阻止或者您的浏览器不支持”...
  4. Android之內置、外置SDCard
  5. python中format和int_python函数之format()
  6. 针对“云计算”服务安全思路的改进-花瓶模型V4.0
  7. 在moss上自己总结了点小经验。。高手可以飘过
  8. mac文件修改权限设置
  9. MagicDraw二次开发过程
  10. iOS逆向一:数字签名苹果应用双重签名原理应用重签名
  11. C++第一话---->初识C++及命名空间
  12. java面试宝典2013
  13. Windows10禁止自动重启和按键盘任意键自动开机
  14. 十进制转化成二、八、十六进制的一个小程序
  15. 《痞子衡嵌入式半月刊》 第 26 期
  16. 最能拉出同行差距的细节,99%的零售店老板都错过了
  17. ONLYOFFICE部署与集成
  18. PHP imagick安装与配置
  19. cad线段总和lisp_cad lisp-求线段总长度
  20. iOS多线程——概念与原理

热门文章

  1. Echarts 绘制单独省份地图
  2. 磁盘分区管理工具(DiskGenius Pro 5.3)pjb 附安装教程
  3. ROS示例----TIAGo教程
  4. 洛谷 5061 秘密任务——二分图染色
  5. 阿里云部署hexo博客之旅
  6. nginx-基础知识
  7. 共创RPA发展生态,2019中国RPA应用与发展论坛在北京成功举办
  8. 科大星云诗社动态20210130
  9. Unity流水账14:GL、Graphics及CommandBuffer
  10. 无功补偿的原理和形式