《流畅的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:一摞有序的纸牌相关推荐

  1. python日课:NumPy ndarray

    <利用Python进行数据分析>(原书第2版)4.1 示例代码练习 创建数组 In [125]: np.arange(10) Out[125]: array([0, 1, 2, 3, 4, ...

  2. python日课:基础练习题十三

    13.列表list = [1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25] 知识点1:map() 菜鸟教程:Pyth ...

  3. 开课吧python小课学了有用吗-和年薪百万的CFO大佬聊天后,我慌了!

    原标题:和年薪百万的CFO大佬聊天后,我慌了! "我太失败了!"上周,小志给我发来信息. 小志毕业后就来到一家公司做财务,两年来任劳任怨,说已经有3年的工作经验一点也不过分,数据统 ...

  4. 2017.2.14 日课

    今天一天做了两件事,上午写天池的口碑预测竞赛,下午读low-rank方面的论文,来寻找dual-camera结构图像对齐的思路.闲书方面,读完了<对冲基金到底是什么>. 天池口碑竞赛 在这 ...

  5. 微软推出Python入门课,登上GitHub趋势榜第一(附视频)

    来源:新智元 本文约900字,建议阅读10分钟. 本文带你看视频轻松学习python课程! [ 导读 ] 微软针对 Python 初学者,推出了一套免费的教程视频.这套课程最大的特定是轻松简洁,一上线 ...

  6. 开课吧python小课值得么-好消息!今天,审计、会计、税务、财务主管彻底沸腾了……...

    原标题:好消息!今天,审计.会计.税务.财务主管彻底沸腾了-- "我们预计到2025年,基础财务都会被机器人替代."有意识地关注行业趋势的财会人应该多多少少听过这句话. 这是「德勤 ...

  7. 开课吧python小课值得么-领导想提拔你,从来看的不是努力!

    原标题:领导想提拔你,从来看的不是努力! 2020年对于很多职场人来讲,都是异常艰难的一年. 我的大学同学小迪,在北京一家互联网公司做运营,任劳任怨工作了3年,本想着今年可以涨一波薪,结果却在前几天接 ...

  8. 开课吧python小课值得么-材料学硕博士建议掌握的高效论文工具

    一位土博哥们最近频繁深夜找我语音,每次聊的内容都是老三样:重读文献.改hypothesis.重做实验. 几经波折的文章以为终要见刊,结果又要大手术,土博心力交瘁,甚至有点想放弃. 每一次"论 ...

  9. 开课吧python小课值得么-领导想提拔你,从来看的不止努力!

    领导想提拔你,从来看的不止努力! " 今天,又是加班满满的一天." 琳琳苦笑. 昨天跟闺蜜琳琳约了一块吃饭,坐下来没说几句话,琳琳就接到了领导的电话,直接打车赶去公司加班. 不知道 ...

最新文章

  1. 区分HPUX是Itanium还是PA-RISC
  2. c语言源程序的下载,编程(C语言源程序代码)
  3. PowerDesigner的Table视图同时显示Code和Name的方法[转发]
  4. 大数据WEB阶段(六)MySql 下载、安装、卸载与配置
  5. 恐怖地狱火恶魔叉404模板下载
  6. 《南明史》txt版本
  7. Oracle数据泵的使用
  8. php 行 excel表格,PHP电子表格-无法查看Excel文件
  9. 洛谷P3649 [APIO2014]回文串(回文自动机)
  10. 08CMS之后台二次开发
  11. Up in the Air-19
  12. EXCEL根据两点经纬度计算距离
  13. 数据库课程设计-----------学生选课管理系统的设计
  14. 代码实现 | LDA方法分析红楼梦各回主题
  15. ecshop smarty php,ecshop的smarty基础普及知识
  16. 微软关系搜索——人立方,垂直个性搜索
  17. mysql left_mysql的left函数
  18. 海信计算机辅助统,海信计算机辅助手术系统(CAS)将覆盖山东三级医院
  19. 自动挡汽车档位说明及图解(转)
  20. 计算机密码应用基础试题及答案,计算机应用基础试题及参考答案.doc

热门文章

  1. Android StudioTV开发教程(二十)电视应用程序清单 【完结篇】
  2. 曙光I620 - G30 配置 iLo
  3. 查找算法——二分查找【代码实现】
  4. 用java编写博弈树_并行博弈树搜索算法-第1篇 什么是博弈树搜索算法
  5. linux7开启telnet服务,centos7开启telnet服务
  6. NuWa热修复原理基础详细解说——初识,热修复
  7. centos 7 下 yum 安装 mysql 5.7.29
  8. T-SQL中的注释符和运算符
  9. 第十三篇、文本框、密码框和文本域。
  10. 链接/装载/运行(3)-目标文件内容解析