当你使用len(a)获取a的长度,使用obj[key]获取一个key的值时的畅快和舒适,在于Python庞大的设计思想(Pythonic)。

  而obj[key]背后其实是__getitem__方法,Python实现的会被框架本身调用的方法之一。像__len__,__getitem__这样的方法称为特殊方法或者双下方法。

  下面用一个例子展示如何实现这两个特殊方法,以及见证特殊方法的强大:

    此处用到collections模块中的namedtuple方法,返回一个具名元组子类。

# -*- coding: utf-8 -*-
# Nolaimport collections
from random import choiceCard = collections.namedtuple('Card', ['rank', 'suit'])  # 返回具有命名字段的元组的新子类 表示一张牌

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)  # ♣->♦->♥->♠ 2-A 花色和大小从小到大 0(2梅花色)-51(A黑桃色) 花色大小映射def spades_high(card):"""纸牌升序:param card::return:"""rank_value = FrenchDeck.ranks.index(card.rank)  # 获取纸牌大小indexreturn rank_value * len(suit_values) + suit_values[card.suit]  # 纸牌大小index * 4色 + 花色权重 2clubs=0 2diamonds=1class FrenchDeck(object):# ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 13ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()  # ['spades', 'diamonds', 'clubs', 'hearts'] 4def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranksfor suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]if __name__ == '__main__':# namedtuple用法Point = collections.namedtuple('Point', ['x', 'y'])print(Point.__doc__)  # docstring   Point(x, y)p = Point(11, 22)print(p[0] + p[1])  # 使用indexx, y = p  # 像元组一样解包print(x, y)print(p.x, p.y)  # 使用字段名获取对应值d = p._asdict()  # 转为dict  OrderedDict([('x', 11), ('y', 22)]) 11 22print(d, d['x'], d['y'])print(Point(**d))  # dict打包为新子类  Point(x=11, y=22)print(p._replace(x=100))  # 类似str替换  Point(x=100, y=22)print('@.@ '*20 + "\n"*2)# 得到一个纸牌对象beer_card = Card('7', 'diamonds')print(beer_card)  # Card(rank='7', suit='diamonds')print('@.@ ' * 20 + "\n"*2)# len函数查看一叠牌有多少张deck = FrenchDeck()print(len(deck))  # 52print('@.@ ' * 20 + "\n"*2)# 使用__getitem__方法从一叠牌中抽取特定的一张牌print(deck[0])  # 第一张  Card(rank='2', suit='spandes')print(deck[-1])  # 最后一张  Card(rank='A', suit='hearts')print('@.@ ' * 20 + "\n" * 2)# 使用python内置函数random.choice随机抽取一张牌print(choice(deck))  # Card(rank='9', suit='hearts')print(choice(deck))  # Card(rank='3', suit='diamonds')print('@.@ ' * 20 + "\n" * 2)# 抽取最上面3张print(deck[:3])# 只看牌面是A的牌print(deck[-4:])print(deck[48:])print('@.@ ' * 20 + "\n" * 2)# 仅仅实现__getitem__方法,这一摞牌就编程可迭代了for card in deck[:5]:print(card)print('@.@ ' * 20 + "\n" * 2)# 反迭代reverse listfor card in reversed(deck):if card.rank == "K":breakprint(card)print('@.@ ' * 20 + "\n" * 2)# in运算符可用在FrenchDeck类上,因为它是可迭代的print(Card('Q', 'diamonds') in deck)print(Card('S', 'diamonds') in deck)print('@.@ ' * 20 + "\n" * 2)# spades_high函数对牌进行升序排序 标准库中sorted函数自增可根据指定key自增排序 reverse参数为True倒序for card in sorted(deck[:8], key=spades_high, reverse=True):print(card)# Card(rank='3', suit='spades')# Card(rank='3', suit='hearts')# Card(rank='3', suit='diamonds')# Card(rank='3', suit='clubs')# Card(rank='2', suit='spades')# Card(rank='2', suit='hearts')# Card(rank='2', suit='diamonds')# Card(rank='2', suit='clubs')print('@.@ ' * 20 + "\n" * 2)

转载于:https://www.cnblogs.com/NolaLi/p/10616878.html

Python用起来极度舒适的强大背后相关推荐

  1. 小学生python入门-极度舒适的全套 Python 入门教程,小学生看了也能学会

    编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...

  2. 极度舒适的 Python 入门教程,佩奇也能学会~

    编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...

  3. python打印小猪佩琪_极度舒适的 Python 入门教程,小猪佩奇也能学会~

    编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...

  4. 人民日报关于996的这段【内容引起极度舒适】!

    这张图放这儿是咋回事?待会说. 先说个很让人激动的事.最近随着996事件的发酵.升级.放大.持续升温,引起了众多互联网大佬的关注,很多人都忍不住发声说话了. 大佬们以为盛几碗鸡汤就能把大家灌晕,让大家 ...

  5. android 相册相似图片,这样整理手机相册,容易引起极度舒适

    原标题:这样整理手机相册,容易引起极度舒适 手机拍照非常方便,大家平常都喜欢随手拍下各种照片去记录生活:此外,手机也常用来拍文件.笔记.PPT:还有屏幕截图.网络图片.表情包--日积月累整个相册凌乱不 ...

  6. python 概率分布函数_如何在Python中实现这五类强大的概率分布

    匿名用户 1级 2016-04-25 回答 首页 所有文章 观点与动态 基础知识 系列教程 实践项目 工具与框架应用 工具资源 伯乐在线 > Python - 伯乐在线 > 所有文章 &g ...

  7. 手工电熨斗回流焊,​小的们,归位,画面极度舒适,​Enjoy

    手工电熨斗回流焊,画面极度舒适,Enjoy!点击上方视频号,求点赞,求点赞,求点赞

  8. 魂武者服务器维护,玩家对魂武者公益服怎么看?极度舒适的游戏体验!

    原标题:玩家对魂武者公益服怎么看?极度舒适的游戏体验! 魂武者公益服真的有吗? 魂武者公益服和官服一样吗? 魂武者公益服在哪里可以找到? 玩家对魂武者公益服怎么看?极度舒适的游戏体验!魂武者是腾讯一款 ...

  9. python小学生 视频教程_极度舒适的全套 Python 入门教程,小学生看了也能学会

    编程几乎已经成为现代人的必修课,尤其是Python,不仅占领了编程趋势和工资列表很长一段时间,但也多次进入小学教科书,甚至成为了信息技术浙江高考\u2026\u2026本教程属于最基本的入门级.不仅适 ...

最新文章

  1. BCH的压力测试其实已经开始了
  2. Linux文件系统2---VFS的四个主要对象
  3. php 错误传递,php-调用时通过引用传递错误,无法修复代码
  4. HDOJ1035 ( Robot Motion ) 【递归】
  5. DeepLearning:tensorflow 参数初始化和参数保存
  6. XenApp Farm:修改密码、退域、更改Farm
  7. 02-继承的本质-Objective-C基础
  8. spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
  9. ipad分屏大小怎么调整_flash怎么调整元素大小-Adobe flash统一图形大小的方法
  10. 今天,我辞职了,35岁对测试员的影响究竟有多大?
  11. python读写excel表格_Python读写Excel表格(简单实用)
  12. 深度学习基础(一) —— softmax 及 logsoftmax
  13. Java Web程序设计笔记 • 【第1章 Web应用程序】
  14. Apache Jena TDB 增删改查操作
  15. 笔记 How Powerful are Spectral Graph Neural Networks
  16. 子组件向父组件传参的几种方法
  17. ARMv8 Cortex-a 编程向导手册学习_2.ARMv8-A 寄存器
  18. 电路课组(一)电路原理 Review 2 动态电路时域分析
  19. 光线通过三棱镜模拟matlab仿真
  20. 武大版c语言程序设计习题 二维数组 简易学生成绩查询系统,《C语言程序设计》程设计报告.docx...

热门文章

  1. oracle for循环
  2. 走出海量数据及访问量压力困境收藏[转]
  3. 关于flock文件锁的阻塞与非阻塞
  4. ajax查询数据的举例
  5. Bw树:新硬件平台的B树(内存数据库中的b树索引)
  6. iOS 7 iPhone iPad应用开发技术详解
  7. jquery_选择器
  8. 【原創】WinMo之移動今日插件
  9. 大亚DP607超级密码,破解方法
  10. android listview左滑删除