Python用起来极度舒适的强大背后
当你使用len(a)获取a的长度,使用obj[key]获取一个key的值时的畅快和舒适,在于Python庞大的设计思想(Pythonic)。
而obj[key]背后其实是__getitem__方法,Python实现的会被框架本身调用的方法之一。像__len__,__getitem__这样的方法称为特殊方法或者双下方法。
下面用一个例子展示如何实现这两个特殊方法,以及见证特殊方法的强大:
此处用到collections模块中的namedtuple方法,返回一个具名元组子类。
# -*- coding: utf-8 -*-
# Nola import collections
from random import choice Card = 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) # 获取纸牌大小index
return rank_value * len(suit_values) + suit_values[card.suit] # 纸牌大小index * 4色 + 花色权重 2clubs=0 2diamonds=1 class FrenchDeck(object):
# ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 13
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split() # ['spades', 'diamonds', 'clubs', 'hearts'] 4 def __init__(self):
self._cards = [Card(rank, suit) for rank in self.ranks
for 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]) # 使用index
x, y = p # 像元组一样解包
print(x, y)
print(p.x, p.y) # 使用字段名获取对应值
d = p._asdict() # 转为dict OrderedDict([('x', 11), ('y', 22)]) 11 22
print(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('', 'diamonds')
print(beer_card) # Card(rank='7', suit='diamonds')
print('@.@ ' * 20 + "\n"*2) # len函数查看一叠牌有多少张
deck = FrenchDeck()
print(len(deck)) #
print('@.@ ' * 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 list
for card in reversed(deck):
if card.rank == "K":
break
print(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)
Python用起来极度舒适的强大背后的更多相关文章
- 极度舒适的 Python 入门教程,小猪佩奇也能学会~
编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...
- 01--[转]C++强大背后
[转]C++强大背后 2014-01-22 分类:互联网 阅读(9295) 评论(6) 在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bj ...
- Python和SQL Server 2017的强大功能
Python和SQL Server 2017的强大功能 摘要: 源:https://www.red-gate.com/simple-talk/sql/sql-development/power-pyt ...
- 机器学习入门:极度舒适的GBDT原理拆解
机器学习入门:极度舒适的GBDT拆解 本文旨用小例子+可视化的方式拆解GBDT原理中的每个步骤,使大家可以彻底理解GBDT Boosting→Gradient Boosting Boosting是集成 ...
- C++强大背后
转自MiloYip大神的博客 [原文]http://www.cnblogs.com/miloyip/archive/2010/09/17/behind_cplusplus.html 在31年前(197 ...
- python的with语句,超级强大
With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...
- 如何在Python中实现这五类强大的概率分布
R编程语言已经成为统计分析中的事实标准.但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易.我要使用Python实现一些离散和连续的概率分布.虽然我不会讨论这些分布的数学细节,但我会 ...
- IDEA 公司推出新字体,极度舒适~
这几天炒得沸沸扬扬的 Intellij IDEA 公司 JetBrains 推出了一种新字体:JetBrains Mono,据说它是专为开发人员设计的,下面栈长带大家一起来吃个瓜. JetBrains ...
- 吴裕雄--天生自然python学习笔记:pandas模块强大的数据处理套件
用 Python 进行数据分析处理,其中最炫酷的就属 Pa ndas 套件了 . 比如,如果我 们通过 Requests 及 Beautifulsoup 来抓取网页中的表格数据 , 需要进行较复 杂的 ...
随机推荐
- 《视觉SLAM十四讲课后作业》第二讲
1.设线性⽅程 Ax = b,在 A 为⽅阵的前提下,请回答以下问题:1. 在什么条件下,x 有解且唯⼀? 非齐次线性方程在A的秩与[A|B]的秩相同时方程有解,当R(A)=R(A,B)=n时方程有唯 ...
- 设计模式理解(八)结构型——装饰者模式(记得加上UML图 --- 未完)
一段时间没写,又忘了,晕...设计模式这种东西一定要经常用. 装饰者模式(Decorator)用于动态地给一个对象增加一些额外的职责,就增加功能来说,他比生成子类更为灵活. 装饰者模式的原则是: 能用 ...
- UIPresentationController - iOS自定义模态弹出框
参考: https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Definin ...
- day06深浅拷贝,元组,字典,集合
深浅拷贝 # 值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来 # ls内部的值发生任何变化,ls1都会随之变化 ls2 = ...
- 彻底清除 Windows 服务
如果服务已经停止, 或从注册表中删除, 但是在任务管理器中仍能看到服务躺在列表里面. 只需要找到服务的PID, 然后运行命令: taskkill /PID 服务的PID /f 即可.
- ip xfrm命令是做什么的?
答: 设置xfrm.xfrm(transform configuration)是一个IP框架,用来转换数据包的格式,也就是使用算法来加密数据包,该框架用作IPsec协议的一部分 ip xfrm sta ...
- windows中的软链接硬链接等
学校嘛,有些时候还是得逆逆上网客户端啥的,并且学校的不少工作,这Windows的需求还是挺强的,之前Win10的体验并不是太好,不过时隔这么久,打算从7升级到10了,恰好系统也该换了. 首先是命令行的 ...
- bzoj2131 免费的馅饼——树状数组优化dp
中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ...
- Generator
基本概念 Generator函数是ES6提供的一种异步编程解决办法,语法行为与传统函数完全不同. Generator函数有多种理解角度.语法上,首先可以把它理解成,Generator函数是一个状态机, ...
- Java面试题之Java基础
1. JDK 和 JRE 有什么区别? JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台.所有的Java 程序都要在JRE下才能运行.普通用户只需要运行已开 ...