一摞Python风格纸牌
时间:2021-09-05
本文章向大家介绍一摞Python风格纸牌,主要包括一摞Python风格纸牌使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
import collections # 引入collections模块
Card = collections.namedtuple('Card', ['rank', 'suit']) # 用namedtuple创造了一个简单的类Card
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 使用列表操作生成字符串类型数字组成的列表,然后加上列表['J','Q','K','A']
suits = 'spades diamonds clubs hearts'.split() # split()函数不输入参数,默认使用空格来分割字符串,分割出黑桃、方块、梅花、红桃
def __init__(self): # 初始化类
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] # 通过两个循环分别遍历ranks和suits来组成52张牌
def __len__(self): # 定义特殊方法__len__
return len(self._cards) # 通过len()函数来返回类属性_cards的长度
def __getitem__(self, position): # 定义特殊方法__getitem__
return self._cards[position] # 根据索引position返回self._cards中该索引位置的字符串
beer_card = Card('7', 'diamonds') # 实例化类Card
beer_card
Card(rank='7', suit='diamonds')
deck = FrenchDeck()
len(deck) # 调用类中__len__方法来查看一摞牌有多少张
52
deck[0] # 有__getitem__方法来根据索引获取字符串
Card(rank='2', suit='spades')
from random import choice # 从模块random中引入一个随机选出一个元素的函数choice
for i in range(3):
print(choice(deck)) # 将choice函数在这一摞纸牌上实例化,来随机抽选一张纸牌
Card(rank='5', suit='diamonds')
Card(rank='8', suit='spades')
Card(rank='7', suit='spades')
deck[:3] # 类的__getitem__方法将[]操作交给了self._cards,所以实例化的deck类自动支持切片操作
[Card(rank='2', suit='spades'),
Card(rank='3', suit='spades'),
Card(rank='4', suit='spades')]
for card in deck: # 实现了__getitem__方法,这一摞牌就变成了可迭代的
print(card)
break
for card in reversed(deck): # 也可以进行反向迭代
print(card)
break
Card(rank='2', suit='spades')
Card(rank='A', suit='hearts')
迭代通常是隐式的,如果一个集合类型没有实现__contain__方法,那么in运算符就会按顺序做一次迭代搜索
in运算符可以用在FrenchDeck类上,因为它是可迭代
Card('Q', 'hearts') in deck
True
用点数来判定扑克牌的大小。2最小,A最大;同时还要加上对花色的判定,黑桃最大、红桃次之、方块再次、梅花最小。
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) # 创建点数列表
def spades_high(card):
rank_value = FrenchDeck.ranks.index(card.rank) # FrenDeck类的属性ranks的index方法来获取卡片的rank的索引,返回索引越大,牌也就越大
return rank_value * len(suit_values) + suit_values[card.suit] # 将返回的牌的索引*4(len(suit_values)=4)然后加上花色的大小就等于牌的大小
for card in sorted(deck, key=spades_high): # 使用参数key来使用排序方法spades_high
print(card)
Card(rank='2', suit='clubs')
Card(rank='2', suit='diamonds')
Card(rank='2', suit='hearts')
Card(rank='2', suit='spades')
Card(rank='3', suit='clubs')
Card(rank='3', suit='diamonds')
Card(rank='3', suit='hearts')
Card(rank='3', suit='spades')
Card(rank='4', suit='clubs')
Card(rank='4', suit='diamonds')
Card(rank='4', suit='hearts')
Card(rank='4', suit='spades')
Card(rank='5', suit='clubs')
Card(rank='5', suit='diamonds')
Card(rank='5', suit='hearts')
Card(rank='5', suit='spades')
Card(rank='6', suit='clubs')
Card(rank='6', suit='diamonds')
Card(rank='6', suit='hearts')
Card(rank='6', suit='spades')
Card(rank='7', suit='clubs')
Card(rank='7', suit='diamonds')
Card(rank='7', suit='hearts')
Card(rank='7', suit='spades')
Card(rank='8', suit='clubs')
Card(rank='8', suit='diamonds')
Card(rank='8', suit='hearts')
Card(rank='8', suit='spades')
Card(rank='9', suit='clubs')
Card(rank='9', suit='diamonds')
Card(rank='9', suit='hearts')
Card(rank='9', suit='spades')
Card(rank='10', suit='clubs')
Card(rank='10', suit='diamonds')
Card(rank='10', suit='hearts')
Card(rank='10', suit='spades')
Card(rank='J', suit='clubs')
Card(rank='J', suit='diamonds')
Card(rank='J', suit='hearts')
Card(rank='J', suit='spades')
Card(rank='Q', suit='clubs')
Card(rank='Q', suit='diamonds')
Card(rank='Q', suit='hearts')
Card(rank='Q', suit='spades')
Card(rank='K', suit='clubs')
Card(rank='K', suit='diamonds')
Card(rank='K', suit='hearts')
Card(rank='K', suit='spades')
Card(rank='A', suit='clubs')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='hearts')
Card(rank='A', suit='spades')
原文地址:https://www.cnblogs.com/Reion/p/15230718.html
- 概率论12 矩与矩生成函数
- Python的hasattr() getattr() setattr() 函数使用方法详解
- 查找字符串中出现最多的字符
- C++工程中常用的宏定义(#define)
- 面向对象系列讲解—认识对象
- 基于 KIF 的 iOS UI 自动化测试和持续集成
- 面向对象系列讲解—面向对象的含义&工厂模式
- 庖丁解牛看委托和事件(续)
- ReactiveCocoa中潜在的内存泄漏及解决方案
- 面向对象系列讲解——混合模式
- 火力全开——仿造Baidu简单实现基于Lucene.net的全文检索的功能
- Go实战--实现简单的restful api
- 特殊字体神器-fontmin,秒杀一切工具
- 庖丁解牛——深入解析委托和事件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Semaphore回顾
- iOS13 关闭黑暗模式+状态栏显示问题解决方法
- 0807-6.2.0-CDSW中Session列表和team分析
- 单细胞转录组基础分析八:可视化工具总结
- 单细胞转录组基础分析七:差异基因富集分析
- 定位权限请求时易犯的错误小结
- NSOperationQueue队列中操作依赖相关思考
- 单细胞转录组高级分析一:多样本合并与批次校正
- 10元最多可喝多少瓶啤酒?(不可借酒+可借酒,swift语言实现)
- 单细胞转录组高级分析二:转录调控网络分析
- 关于数组内元素是否会被改变的思考
- 排序之选择排序实现(swift)
- 去除友盟等第三方SDK失败的解决办法(clang: error: no such file or directory:xx)
- iOS踩坑之多代理模式使用注意
- 单细胞转录组高级分析三:细胞通讯分析