################
# hashable协议 #
################ # 一个对象能被称为hashable,它必须实现__hash__与_eq__方法:
>>>{[1,2,3]} # TypeError: unhashable type: 'list'
>>>{{'Justin':123456}} # TypeError: unhashable type: 'dict'
>>>{{1,2,3}} # TypeError: unhashable type: 'set' # 虽然p1与p3代表的是相同的坐标,但是集合中两个都收纳了,这是因为p1和p3使用默认的__hash__()获取的hash值不同
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def __repr__(self):
return 'Point({},{})'.format(self.x,self.y)
p1=Point(1,1)
p2=Point(2,2)
p3=Point(1,1)
ps={p1,p2,p3}
print(ps) # 显示{Point(1,1), Point(2,2), Point(1,1)} # 如果想让集合能提出代表相同坐标的Point对象,必须自行实现__eq__()与__hash__()方法
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def __eq__(self, other):
if hasattr(other,'x') and hasattr(other,'y'):
return self.x == other.x and self.y ==other.y
return False
def __hash__(self):
return 41 * (41+self.x)+self.y
def __str__(self):
return self.__repr__()
def __repr__(self):
return 'Point({},{})'.format(self.x,self.y)
p1=Point(1,1)
p2=Point(2,2)
p3=Point(1,1)
ps={p1,p2,p3}
print(ps) # 显示{Point(1,1), Point(2,2)} ################
# iterable协议 #
################ # 具有__iter__()方法的对象,就是一个iterable(可迭代的)对象
# 生成器也是一种迭代器,对于大部分的迭代需求,使用yield语句创建生成器会比较简单和直接
def cycle(elems):
while True:
for elem in elems:
yield elem
abcd_gen=cycle(('abcd'))
print(next(abcd_gen))
print(next(abcd_gen))
print(next(abcd_gen))
print(next(abcd_gen))
print(next(abcd_gen)) # 实现__iter__()
class Repeat:
def __init__(self,elem,n):
self.elem=elem
self.n=n
def __iter__(self):
elem=self.elem
n=self.n
class _Iter:
def __init__(self):
self.count=0
def __next__(self):
if self.count < n:
self.count += 1
return elem
else:
raise StopIteration
def __iter__(self):
return self
return _Iter()
for elem in Repeat('A',5):
print(elem,end=' ') # 使用itertools模块
# 在Python标准链接库中提供了itertools模块,当中有许多函数可以谢谢胡创建迭代器和生成器
import itertools
print(list(itertools.repeat('A',10))) #['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
print(list(itertools.accumulate([1,2,3,4,5]))) # [1, 3, 6, 10, 15]
print(list(itertools.accumulate([1,2,3,4,5],int.__mul__))) # [1, 2, 6, 24, 120]
print((list(itertools.chain('ABC',[1,2,3])))) # ['A', 'B', 'C', 1, 2, 3]
print(list(itertools.chain.from_iterable(['ABC',[1,2,3]]))) # ['A', 'B', 'C', 1, 2, 3]
print(list(itertools.chain.from_iterable([[9,8,6],[1,2,3]]))) #[ 9, 8, 6, 1, 2, 3]
print(list(itertools.dropwhile(lambda x:x < 5,[1,4,6,4,1]))) # [6, 4, 1]
print(list(itertools.takewhile(lambda x:x < 5,[1,4,6,4,1]))) # [1, 4]
print(list(itertools.filterfalse(lambda x:x % 2,[1,2,3,4]))) # [2, 4] # 有时候可能需要按某个键进行分类,可以使用itertools的groupby函数:
name=['Justin','Monica','Irene','Pika','caterpillar']
group_by_name=itertools.groupby(name,lambda name:len(name))
for length,group in group_by_name:
print(length,list(group))
# 6 ['Justin', 'Monica']
# 5 ['Irene']
# 4 ['Pika']
# 11 ['caterpillar'] ################
# orderable协议 #
################ # 如果希望使用自定义类型的sorted()或者使用列表的sort()时有默认的排序定义,那么必须实现__lt__()方法
class Customer:
def __init__(self,name,symbol,age):
self.name=name
self.symbol=symbol
self.age=age
def __lt__(self, other):
return self.name < other.name
def __str__(self):
return "Customer('{name}','{symbol}'".format(**vars(self))
def __repr__(self):
return self.__str__()
customers=[
Customer('Justin','A',40),
Customer('Irene','C',8),
Customer('Monica','B',37),
]
print(sorted(customers)) # [Customer('Irene','C', Customer('Justin','A', Customer('Monica','B'] # opertor模块的itemgetter和attrgetter,前者可以针对具有索引的结构,后者可以针对对象的属性
# 下面是使用itemgetter的示范:
from operator import itemgetter
custormers=[('Justin','A',40),('Irene','C',8),('Monica','B',37),]
print(sorted(custormers,key=itemgetter(0))) # [('Irene', 'C', 8), ('Justin', 'A', 40), ('Monica', 'B', 37)]
print(sorted(custormers,key=itemgetter(1))) # [('Justin', 'A', 40), ('Monica', 'B', 37), ('Irene', 'C', 8)]
print(sorted(custormers,key=itemgetter(2))) # [('Irene', 'C', 8), ('Monica', 'B', 37), ('Justin', 'A', 40)] # 下面是使用attrgetter的示范:
from operator import attrgetter
class Customer:
def __init__(self,name,symbol,age):
self.name=name
self.symbol=symbol
self.age=age
def __repr__(self):
return "Customer('{name}','{symbol}',{age})".format(**vars(self))
customers=[
Customer('Justin','A',40),
Customer('Irene','C',8),
Customer('Monica','B',37),
]
print(sorted(customers,key=attrgetter('name')))
# [Customer('Irene','C',8), Customer('Justin','A',40), Customer('Monica','B',37)]
print(sorted(customers,key=attrgetter('symbol')))
# [Customer('Justin','A',40), Customer('Monica','B',37), Customer('Irene','C',8)]
print(sorted(customers,key=attrgetter('age')))
# [Customer('Irene','C',8), Customer('Monica','B',37), Customer('Justin','A',40)]

hashable/iterable与orderable的更多相关文章

  1. graph_tool源码及其注释

    #! /usr/bin/env python # -*- coding: utf-8 -*- # # graph_tool -- a general graph manipulation python ...

  2. Python创建容器和集合之源码分析

    _collections_abc.py文件中提供了许多抽象基类,这些类将集合分解成许多互相独立的属性集 __all__ = ["Awaitable", "Coroutin ...

  3. python(七):元类与抽象基类

    一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(o ...

  4. python高级(三)—— 字典和集合(泛映射类型)

    本文主要内容 可散列类型 泛映射类型 字典 (1)字典推导式 (2)处理不存在的键 (3)字典的变种 集合 映射的再讨论 python高级——目录 文中代码均放在github上:https://git ...

  5. Python 3 初探,第 2 部分: 高级主题

    Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本.它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题.本文是这个由两部分组成的系列文章中的第 ...

  6. Effective Python之编写高质量Python代码的59个有效方法

                                                         这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...

  7. collections 中 typing 中对象的引用

    from typing import ( Callable as Callable, Container as Container, Hashable as Hashable, Iterable as ...

  8. 编写高质量Python代码的59个有效方法

    Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...

  9. [python数据结构] hashable, list, tuple, set, frozenset

    学习 cs212 unit4 时遇到了 tuple, list, set 同时使用的问题,并且进行了拼接.合并操作.于是我就被弄混了.所以在这里进行一下总结. hashable and unhasha ...

随机推荐

  1. TZOJ 1513 Farm Tour(最小费用最大流)

    描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 &l ...

  2. iOS工程中创建pch文件

    1.新建pch类文件 2.在工程配置中,Build Setting 下搜索"pre"寻找Apple LLVM6.1 - Language下的 Preflx Header 3.点开P ...

  3. fastjson的常用方法

    /** * 解析对象形式的json字符串 */ public static void test1() { String jsonStr = "{\"JACKIE_ZHANG\&qu ...

  4. JFinal上传文件时用getFile()方法报错

    原因是缺少cos.jar包,补上即可.

  5. JFinal Web开发学习(三)前后台路由设计

    效果图: 一.写控制器 1.在controller包中新建AdminController后台控制器,继承Controller,实现一个index方法,作为的处理方法. /admin 后面,这个控制器中 ...

  6. BCH/BSV coin split troubleshooting

    BCH/BSV coin split troubleshootingMark Lundeberg 2018 November 27ResourcesGuides:Locktime based spli ...

  7. js 逻辑运算符

    两个逻辑运算符的操作顺序在自己的脑海里一直理不清,用js做了个实验 <script type="text/javascript">    if(false && ...

  8. VS2013一次替换变量名

    插件下载地址:https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194 该插件目前只支持: ...

  9. 计算器类(C++&JAVA——表达式转换、运算、模板公式)

    运行: (a+b)*c 后缀表达式:ab+c* 赋值: Enter the a : 10 Enter the b : 3 Enter the c : 5 结果为:65 代码是我从的逻辑判断系统改过来的 ...

  10. Hadoop(二) HADOOP集群搭建

    一.HADOOP集群搭建 1.集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主要有 Na ...