################
# 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. elasticsearch查询语句总结

    query 和  filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...

  2. 关于django的操作(四)

    1,关于form组件的写法 定义错误信息使用error_messages,自定义字段名称用lebal,自定义样式需要使用widget,比方说这个是一个什么样子的输入框,attr用于输入输入框的属性等 ...

  3. JAVA EXAM2 复习提纲

    [真假分数相加] //inheritence, extends, use this & super 子类的方法 //two constructors, non-default use 'thi ...

  4. Union and Intersection of two sorted lists 并集和交集

    跟面试官确认是arrayList还是singly-linked list /*  Union 并集:两个升序的list a, b, 返回其并集(升序排序)*/ public class UnionTw ...

  5. Django日志系统

    在Django中使用的日志系统是基于Python中的loggin模块. 首先简单介绍下logging. 一 Loggin模块简介 loggin模块主要包含以下四个部分: Loggers        ...

  6. css背景图充满屏幕

    代码: body { /* 加载背景图 */ background: url(resource/inv_bg.png); /* 背景图不平铺 */background-repeat: no-repea ...

  7. dangerouslySetInnerHTMl

    dangerouslySetInnerHTMl 是React标签的一个属性,类似于angular的ng-bind: 听说这个单词这么长,是故意的,应为有可能不合时宜的使用innerHTML会导致XSS ...

  8. Java 和 Javascript的关系

    写这篇文章是因为看到有人问这个问题,在想怎么会有这种SB问题,不过想想当初SB的我貌似也搞不清两者的关系,认知还是需要一个过程. 然后看到比较经典的回答有:Java 和Javascript的关系就像雷 ...

  9. java有车有房有能力最基本运用

    public class yunsuan { public static void main(String[] args) { // 1是有,0是没有 int i = 1, l = 0;// 有房 i ...

  10. hdu 1175(BFS&DFS) 连连看

    题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...