之前在 《流畅的 Python 》中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王、小王之后的 52 张扑克牌,并实现随机抽牌、排序、洗牌等功能;

创建一个纸牌类

一副扑克除去大王小王之外,剩下的 52 张纸牌以花色为基准(梅花、方块、黑桃、红心)可分为 4 组,每组有 13 张牌组成;因此可创建两个列表一个来存储花色,一个存储 13 个字符;通过两个列表之间的随机组合来生成 52 张纸牌,

代码如下:

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 模块创建一个类来表示一幅纸牌,[’rank','suit'] 分别表示纸牌中的字符(2-10,J-A)和花色;

FranchDeck 类来建 52 张纸牌,其中有两个特殊方法,len() 返回纸牌数量,__getitem__() 获取 position(索引) 下的指定纸牌

# 用 Card 创建一张纸牌

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

print(beer_card) # 打印输出

deck = FrenchDeck()

print('len is -----')

print(len(deck))

# 返回首张 纸牌

print(deck[0])

# 返回最后一张纸牌

print(deck[-1])

# Output

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

len is -----

52

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

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

随机抽取一张牌

这里借助 random 模块实现 随机 抽牌的功能

from random import choice

# 利用 random.choice 随机抽取一张纸牌

print("random choice -----------")

print(choice(deck))

print(choice(deck))

print(choice(deck))

# Output

random choice -----------

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

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

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

列表迭代、切片

因为 __getitem__ 方法 把 [] 操作交给 self._cards 列表 ,除了上面提到的 index 定位之外,FranckDeck() 类还可实现切片、迭代操作;

# 切片操作

print('\nslice is --')

print(deck[:3])

print(deck[8:10])

print('\n迭代操作')

for card in deck[:3]:

print(card)

print('\n 反迭代操作')

for card in reversed(deck[:3]):

print(card)

# Output

slice is --

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

[Card(rank='10', suit='spades'), Card(rank='J', suit='spades')]

迭代操作

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

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

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

反迭代操作

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

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

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

排序操作

常规来说,依据点数来判断扑克牌的大小的话,2最小,A最大。实现点数排序是比较简单的,在创建点数列表时是以上面提到顺序进行创建,排序时只需按照 点数所在 index 作为基准 进行排序即可,

除了 点数之外还有一个 花色也需要考虑,对于花色的话,需要建立一个映射基准(也可以称之为权重),不同花色赋予不同值;Python 的字典类型可以很方面地满足我们的需要

# 创建一个字典映射

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] # index* 4 + suit.value

print('\nSorted ------------------')

# 利用 key = lambda 机制对列表进行排序

for card in sorted(deck,key = spades_high,reverse= True):

print(card)

# Output

Sorted ------------------

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

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

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

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

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

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

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

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

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

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

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

代码解读:

1,代码中利用字典加入了一个映射机制,黑桃为3,红心为2,方块次之,随后梅花;

2,创建 spades_high 函数来计算 每张牌的权重总值;

3,利用 sorted() 函数 key= spades_high 来作为排序基准,来实现扑克牌排序

洗牌操作

洗牌简单来说就是对一副扑克牌重新进行无规则地排序;正常情况random.shuffle 可以很方面地实现这个功能,但前提需要保证对象 满足可变协议,这里 FranchDeck() 是不满足的,直接使用的话会报错:

from random import shuffle

print('-------------------\n'*3)

deck =FrenchDeck()

shuffle(deck)

# Output

x[i], x[j] = x[j], x[i]

TypeError: 'FrenchDeck' object does not support item assignment

对于上面问题,只需要要把 此类由 不变 变成 可变的 即可,创建一个函数赋值为 __setitem__ 属性

from random import shuffle

print('-------------------\n'*3)

def set_deck(deck,position,card):

deck._cards[position] = card

deck1 = FrenchDeck()

print('打乱前\n')

print(deck1[:5])

FrenchDeck.__setitem__ = set_deck

shuffle(deck1)

# Output

打乱前

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

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

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

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

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

打乱后:

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

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

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

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

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

这里抽取到打乱前后纸牌的前 5 个元素,已经实现 洗牌 的功能了!

根据以上的代码部分,可以进一步开发, 提前设计好 54 张扑克牌的可视化图片,

Snipaste_2020-09-27_00-59-22.png

创建一个 key:value 映射关系,对扑克牌字符与可视化图片之间创建一个映射关系,如下图所示,把此关系集存储到指定数据库或文件中,后面使用后可直接调用

Snipaste_2020-09-27_01-06-46.png

按照上面的进阶玩法就可以创建一个基于Python开发扑克牌小程序!

好了,以上就是本篇文章的全部内容了,最后感谢大家的阅读!

python定义一个列表存放52张扑克牌_Python 制作一副扑克牌,有趣的案例!相关推荐

  1. 扑克牌图片一张一张_Python 制作一副扑克牌,有趣的案例

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王之后的 52 张扑克牌,并实现随机抽牌 ...

  2. python做一副54扑克牌发牌_Python 制作一副扑克牌,有趣的案例!

    如果觉得文章写得不错想要博客文章中的数据,请关注公众号:[Z先生点记],已经为你准备了 50本+ Python 电子书籍 与 200G + 优质视频资料,后台回复关键字:1024 即可获取 之前在 & ...

  3. python定义一个列表_如何在Python中创建用户定义的列表?

    你需要将怪物的数量发送给使用它的函数:def welcome(): number = monsters() print('Alright, ' + str(number) + ' monsters.' ...

  4. python定义一个类savingaccount表示银行账户_Python实现信用卡系统(支持购物、转账、存取钱)...

    最近一直在做一个有关信用卡系统的项目,所有很少出来给大家打招呼了,今天也该告一段了,本项目是基于python编程语言做的,此信用卡支持购物,转账和存取钱,下面小编把需求及实现思路大概分享一下,仅供参考 ...

  5. python定义一个函数列表排序_Python 列表(修改、添加、删除、排序)

    Python的基本数据类型有整数,浮点数,布尔,字符串,它们是最基本的数据.在实际编程中,我们要经常组织由很多基本数据组成的集合,这些集合的不同组织方式就是:数据结构,今天讲的是数据结构中的Pytho ...

  6. python定义一个空数组_python数组 1_python 数组最后一个元素_python定义一个空数组 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 感悟: 1.python列表操作里不允许变量类型的指针2.case1类似于冒泡排 ...

  7. python定义字典列表_Python基础语法(四)—列表、元组、字典、集合、字符串

    列表 基本概念列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制: 列表索引值以0为开始值,-1为从未尾的开始位置. 列表可以使用+操作符进行拼接,使用*表示重复. 当列表元素增 ...

  8. 使用python定义一个神经网络结构

    使用python定义一个神经网络 python定义一个神经网络是进行深度学习或者实现神经网络的基础,那么如果定义一个深度神经网络的结构呢? import numpy as np class Netwo ...

  9. Python -- 定义一个函数,判断输入的数是不是质数

    Python – 定义一个函数,判断输入的数是不是质数 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数. #定义一个函数,判断该数是不是质数 def sum(n): ...

最新文章

  1. distribution counting—a sorting method from aocp
  2. [CF460E]Roland and Rose
  3. 【转载】OI生涯结束……在逸夫楼那些的日子里
  4. 区分中英文字符的两种方法: 正则和charCodeAt()方法
  5. 循环类里面的每一个属性
  6. 鸟哥的linux私房菜有乌班图,折腾Ubuntu的一些summary--初装Ubuntu18和重装Ubuntu18
  7. CAN总线技术 | 数据链路层03 - CAN总线竞争与仲裁机制
  8. ERRORS:*: (auth.E003) ‘User.username‘ must be unique because it is named as the ‘USERNAME_FIELD
  9. 130个你需要了解的VIM命令
  10. java 树形菜单遍历_java实现遍历树形菜单方法——service层
  11. 怎么实现单击span时给span添加边框
  12. matlab模拟光伏发电,一种基于MATLAB的小型独立光伏发电仿真模型的制作方法
  13. 杭州第二机场选址的三个备选方案仁和、瓶窑、塘栖中选择瓶窑的理由。元芳,你怎么看?
  14. 十二栋发布新品牌BC12 能否成衍生品市场黑马?
  15. 笔记本蓝牙模块转USB接口方法
  16. 目标设定使用谷歌Analytics(分析)
  17. ZYNQ开发系列——双串口打印以及串口波特率设置
  18. 计算机领域怎么研究区块链,计算机行业深度研究:跨链技术,区块链大航海时代的基石...
  19. 网络营销 10.26
  20. android电池电量监控,android电量监控 Battery Widget Reborn

热门文章

  1. 异步7月上市新书,总有一本适合你
  2. 在教学过程中用到的计算机软件,计算机软件在教学中的运用
  3. 数据库主键一定要自增吗?有哪些场景不建议自增?
  4. 金蝶EAS系统管理员指导手册
  5. 清理微信僵尸粉,微信怎么查看有没有被好友删除或拉黑?
  6. 7.1 Python图像处理之图像分割-自适应阈值
  7. 用js打开电脑的软件
  8. mysql 主键 null_当主键碰到NULL
  9. 开源电子狗项目更新1.1 已实现PS3免引导盘游戏
  10. 阿里云 代码访问mysql_阿里云远程怎么访问mysql_mysql