python 内建比较函数详解
来源:互联网 发布:淘宝和快递合作多少钱 编辑:程序博客网 时间:2024/05/02 04:28
http://blog.sina.com.cn/s/blog_5357c0af01011392.html
我们经常需要比较两个对象,使用自定义的函数是个方法,但不直观
故而我们常常使用比较运算符来直接比较对象,此时我们需要对比较运算符进行自定义(重载)。
如果不重载,那么,对于自定义的对象将会比较对象的地址。
python中,我们可以通过对内建的比较函数进行自定义,来实现运算符重载。
我们常用的比较运算符有
大于 > 对应的内建比较函数为 __gt__()
大于等于 >= 对应的内建比较函数为 __ge__()
等于 == 对应的内建比较函数为 __eq__()
小于 < 对应的内建比较函数为 __lt__()
小于等于 <= 对应的内建比较函数为 __le__()
以下是个范例:
class p(object):
a=p(1,2)
b=p(3,4)
print 'a==b:',a==b
print 'a<b:',a<b
print 'a>b:',a>b
print cmp(a,b)
不过,其中有些需要说明的地方,按理说,我们使用对应的比较运算符就应该只调用对应的函数,但是,当我们只自定义了部分比较运算符时,实际上可能出现偏差:
当只定义了eq,使用=,只会调用相应eq,<= >= 不会调用eq
当只定义了lt,使用<,>都会调用lt,其他正常
当只定义了le,使用<=,>=都会调用le,其他正常
当只定义了gt,效果同lt,当只定义了ge,效果同le
如果如果同时定义了lt,gt,则使用<,>时各自调用,其他正常,同理适用 le,ge
为什么会这样?我不知道,但显然这让我们得到一个结论:相对的比较运算符必须对称存在,就是如果你自定义了lt你就必须自定义gt,如果自定义了le,就必须自定义ge,这就是答案!
还有一个特别的比较函数,他没有对应的运算符,这就是 __cmp__(),我们可以直接使用cmp(x,y)来使用此内置函数。此函数的作用是
如果 x<y 则 返回 -1
如果 x>y 则 返回 1
如果 x==y 则 返回0
那么,我们要问了,x,y是自定义对象时,如何比较呢?
如果我们没有自定义这个函数和其他比较函数的话,默认比较对象x,y的地址
如果我们自定义了比较函数的话,将返回0
如果我们自定义了__cmp__()比较函数的话,则得到函数返回值
但是对于
class tt(object):
def __init__(self,a,b):
self.a = a
self.b = b
这样的类,就不用自定义__cmp__函数,解析器自己会正确解析
- python 内建比较函数详解
- Python的内建比较函数cmp比较原理剖析
- python字符串内建函数详解
- Python 内建函数
- Python内建函数
- Python内建函数
- Python 内建函数
- python 内建函数
- python内建函数
- Python内建函数
- Python 内建函数
- Python--内建函数
- python-内建函数
- python 内建函数
- Python--内建函数
- python内建函数
- python内建函数
- python 内建函数
- 介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX
- binfmts.h 头文件分析 \linux-1.0\linux\include\linux\binfmts.h
- js传递数组参数到ActiveX
- oracle函数总结:有精确小数位的函数,字符串截取函数,大小写转换函数,字符串截取匹配函数,日期函数,系统
- XCODE4.x添加FrameWork
- python 内建比较函数详解
- Gstreamer实现摄像头的远程采集,udp传输,本地显示和保存为AVI文件 发送端
- JSP第三章知识点总结——JSTL EL
- java中各进制之间的转换(十进制转十六进制、十进制转二进制、二进制转十进制、二进制转十六进制)
- adb调试指定设备
- php广告系统优化感想
- 学习CxImage
- web前端开发应该知道的
- String类