[流畅的Python]第一章数据模型
这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣
这一章介绍了 怎么样去视线一个带有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__方法就可以了
[流畅的Python]第一章数据模型的更多相关文章
- 流畅的python第一章python数据模型学习记录
python中有些特殊的方法,以双上下划线开头,并以双下划线结束的方法.如__getitem__,这些方法是特殊的方法,供python解释权内部使用,一般来说不需要调用 还有一种是以双下划线开头的,如 ...
- 简学Python第一章__进入PY的世界
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- python第一章计算机基础
第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 / 显示器 等组成,只有硬件但硬件之间无法进行交流和通信. 1.2 操作系统 操作系统用 ...
- Python第一章-基础知识
第一章:基础知识 1.1 安装python. 直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...
- python第一章:简介与安装--小白博客
Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...
- 学习python 第一章
目录 第一章... 1 1:新建项目... 1 2:修改默认模板... 3 3:什么是变量... 3 4:重指向... 3 5:常量的表示... 4 6:格式化输出(三种方法)... 4 7:打印一个 ...
- python第一章练习题
本章总节 练习题 1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释 编译型:把源代码编译成机器语言的可执行文件,程序执行的时候执行可执行文件即可. 优点:程序执行不 ...
- 【原创】Python第一章
Python总是从第一行代码开始逐步执行,而C是从main函数开始执行. 在Python中,一切东西都是对象. 在Python中,没有C的花括号,不能任意排版,属于同一个语句块的语句需 ...
- 流畅的python第九章符合Python风格的对象学习记录
对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式 repr()便于开发者理解的方式返回对象的字符串表示形式 str()便于用户理解的方式返回对 ...
随机推荐
- [BUUCTF]PWN——roarctf_2019_easy_pwn(详解)
roarctf_2019_easy_pwn 附件 步骤: 例行检查,64位程序,保护全开 试运行一下程序,看看大概的情况,经典的堆块的菜单 64位ida载入,改了一下各个选项的函数名,方便看程序(按N ...
- C# ASP.NET WebApi 跨域设置
概述 前后端分离开发模式,一定会遇到跨域的问题.这里收集了2种 C# Asp.Net webapi 相关的跨域解决方案,方便后续查找参考. 2021/10/28 更新: 有更加简单高效的方式推荐< ...
- 30个类手写Spring核心原理之动态数据源切换(8)
本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)( ...
- 背水一战——CSP2021/NOIP2021 游记
洛谷 version 转载本文章的其他链接: 1(S00021 提供) 2(Ew_Cors 提供) \[\texttt{2021.9.10} \] 终于开坑了. 笑死,初赛根本还没开始复习,反正初赛也 ...
- CF24B F1 Champions 题解
Content 有 \(n\) 场已经进行完的赛车比赛,每场比赛给出前 \(m\) 名的名字.在每场比赛中,前 \(10\) 名的选手分别可以获得 \(25,18,15,12,10,8,6,4,2,1 ...
- CF1438A Specific Tastes of Andre 题解
Content 如果一个序列的和能够被它的长度整除,我们称这个序列是不错的.如果一个序列的所有的非空子序列都是不错的,我们就称这个序列是完美的.现在有 \(t\) 组询问,每组询问给定一个整数 \(n ...
- 源码-DbUtil.java
package com.tetralogy.util; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.D ...
- 『学了就忘』Linux日志管理 — 92、日志轮替
目录 1.日志文件的命名规则 2.logrotate配置文件说明 3.logrotate配置文件的主要参数 1.日志文件的命名规则 日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志 ...
- Mybatis批量插入写法
<insert id="insertBatchList"> INSERT INTO tag ( `tag_name`, `tag_weight`, ) VALUES & ...
- 重学c#系列——datetime 和 datetimeoffset[二十一]
前言 简单介绍一下datetime和 datetimeoffset. 正文 了解一个国家的文化,就要了解一个国家的历史. 要了解datetimeoffset,那么很有必要了解一下datetime. 表 ...