python日课1-1:一摞有序的纸牌
《流畅的python》 第一章 示例1-1
特殊方法
python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以以两个下划线开头,以两个下划线结尾的方法:__init__
,__len__
,__getitem__
。
这些特殊方法名能让自己的对象实现和支持以下的语言架构,并与之交互:
- 迭代
- 集合类
- 属性访问
- 运算符重载
- 函数和方法的调用
- 对象的创建和销毁
- 字符串表示形式和格式化
- 管理上下文(即with块)
示例1-1
import collections
from random import choiceCard = 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, item):return self._cards[item]def choice(self):return choice(self._cards)
首先用**collections.namedtuple
** 构建了一个简单的类来表示一张纸牌。自python2.6,namedtuple
就加入到python,用以构建只有少数属性但是没有方法的对象。
beer_card = Card('7', 'diamonds')
print(beer_card)
输出:
Card(rank=‘7’, suit=‘diamonds’)
可以使用len()来参考一叠牌有多少张,抽取特定的一张纸牌(比如第一张、最后一张)
deck = FrenchDeck()
print(len(deck))
print(deck[0])
print(deck[-1])
print('------------------------------------')
输出:
52
Card(rank=‘2’, suit=‘spades’)
Card(rank=‘A’, suit=‘hearts’)
Python已经内置了从一个序列中随机选出一个元素的函数random.choice
print(deck.choice())
print(deck.choice())
print(deck.choice())
输出:
Card(rank=‘8’, suit=‘hearts’)
Card(rank=‘6’, suit=‘clubs’)
Card(rank=‘10’, suit=‘clubs’)
切片操作
__getitem__
把[]
操作交给了self._cards
列表,所以deck类自动支持切片操作。
print(deck[:3])
print(deck[12::13])
输出:
[Card(rank=‘2’, suit=‘spades’), Card(rank=‘3’, suit=‘spades’), Card(rank=‘4’, suit=‘spades’)]
[Card(rank=‘A’, suit=‘spades’), Card(rank=‘A’, suit=‘diamonds’), Card(rank=‘A’, suit=‘clubs’), Card(rank=‘A’, suit=‘hearts’)]
迭代
for card in deck:print(card)
反向迭代:
for card in reversed(deck):print(card)
隐式迭代:in运算符会按顺序做一次迭代搜索
print(Card('Q', 'hearts') in deck)
输出:
True
排序
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)def spades_high(self):rank_value = FrenchDeck.ranks.index(self.rank)return rank_value * len(suit_values) + suit_values[self.suit]for card in sorted(deck, 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’)
。。。。。。。。。。。。。
如何使用特殊方法
特殊方法的存在是为了被python解释器调用的,你自己并不需要调用它们。
在执行len(deck)
的时候,deck是一个自定义类的对象,python会自己去调用由你实现的__len__
方法。
如果是python内置的类型,比如列表(list)、字符串(str)、字节序列(bytearray)等,那么CPython会抄个近路,__len__
实际上会直接返回PyVarObject里的ob_size属性。直接读取这个值比调用一个方法要快很多。
很多时候,特殊方法的调用是隐式的,比如 for i in x:
这个语句,背后其实用的是iter(x)
,而这个函数的背后则是x.__iter__()
(前提是这个方法在x中被实现了)。
通常你的代码无需直接使用特殊方法。
通过内置的函数(len、iter、str等)来使用特殊方法是最好的选择。
不要自己想当然的随意添加特殊方法。
python日课1-1:一摞有序的纸牌相关推荐
- python日课:NumPy ndarray
<利用Python进行数据分析>(原书第2版)4.1 示例代码练习 创建数组 In [125]: np.arange(10) Out[125]: array([0, 1, 2, 3, 4, ...
- python日课:基础练习题十三
13.列表list = [1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25] 知识点1:map() 菜鸟教程:Pyth ...
- 开课吧python小课学了有用吗-和年薪百万的CFO大佬聊天后,我慌了!
原标题:和年薪百万的CFO大佬聊天后,我慌了! "我太失败了!"上周,小志给我发来信息. 小志毕业后就来到一家公司做财务,两年来任劳任怨,说已经有3年的工作经验一点也不过分,数据统 ...
- 2017.2.14 日课
今天一天做了两件事,上午写天池的口碑预测竞赛,下午读low-rank方面的论文,来寻找dual-camera结构图像对齐的思路.闲书方面,读完了<对冲基金到底是什么>. 天池口碑竞赛 在这 ...
- 微软推出Python入门课,登上GitHub趋势榜第一(附视频)
来源:新智元 本文约900字,建议阅读10分钟. 本文带你看视频轻松学习python课程! [ 导读 ] 微软针对 Python 初学者,推出了一套免费的教程视频.这套课程最大的特定是轻松简洁,一上线 ...
- 开课吧python小课值得么-好消息!今天,审计、会计、税务、财务主管彻底沸腾了……...
原标题:好消息!今天,审计.会计.税务.财务主管彻底沸腾了-- "我们预计到2025年,基础财务都会被机器人替代."有意识地关注行业趋势的财会人应该多多少少听过这句话. 这是「德勤 ...
- 开课吧python小课值得么-领导想提拔你,从来看的不是努力!
原标题:领导想提拔你,从来看的不是努力! 2020年对于很多职场人来讲,都是异常艰难的一年. 我的大学同学小迪,在北京一家互联网公司做运营,任劳任怨工作了3年,本想着今年可以涨一波薪,结果却在前几天接 ...
- 开课吧python小课值得么-材料学硕博士建议掌握的高效论文工具
一位土博哥们最近频繁深夜找我语音,每次聊的内容都是老三样:重读文献.改hypothesis.重做实验. 几经波折的文章以为终要见刊,结果又要大手术,土博心力交瘁,甚至有点想放弃. 每一次"论 ...
- 开课吧python小课值得么-领导想提拔你,从来看的不止努力!
领导想提拔你,从来看的不止努力! " 今天,又是加班满满的一天." 琳琳苦笑. 昨天跟闺蜜琳琳约了一块吃饭,坐下来没说几句话,琳琳就接到了领导的电话,直接打车赶去公司加班. 不知道 ...
最新文章
- 区分HPUX是Itanium还是PA-RISC
- c语言源程序的下载,编程(C语言源程序代码)
- PowerDesigner的Table视图同时显示Code和Name的方法[转发]
- 大数据WEB阶段(六)MySql 下载、安装、卸载与配置
- 恐怖地狱火恶魔叉404模板下载
- 《南明史》txt版本
- Oracle数据泵的使用
- php 行 excel表格,PHP电子表格-无法查看Excel文件
- 洛谷P3649 [APIO2014]回文串(回文自动机)
- 08CMS之后台二次开发
- Up in the Air-19
- EXCEL根据两点经纬度计算距离
- 数据库课程设计-----------学生选课管理系统的设计
- 代码实现 | LDA方法分析红楼梦各回主题
- ecshop smarty php,ecshop的smarty基础普及知识
- 微软关系搜索——人立方,垂直个性搜索
- mysql left_mysql的left函数
- 海信计算机辅助统,海信计算机辅助手术系统(CAS)将覆盖山东三级医院
- 自动挡汽车档位说明及图解(转)
- 计算机密码应用基础试题及答案,计算机应用基础试题及参考答案.doc
热门文章
- Android StudioTV开发教程(二十)电视应用程序清单 【完结篇】
- 曙光I620 - G30 配置 iLo
- 查找算法——二分查找【代码实现】
- 用java编写博弈树_并行博弈树搜索算法-第1篇 什么是博弈树搜索算法
- linux7开启telnet服务,centos7开启telnet服务
- NuWa热修复原理基础详细解说——初识,热修复
- centos 7 下 yum 安装 mysql 5.7.29
- T-SQL中的注释符和运算符
- 第十三篇、文本框、密码框和文本域。
- 链接/装载/运行(3)-目标文件内容解析