Python基础教程:字符串比较is、==、__cmp__

0、str这个class,很常用,也经常可以看到两个字符串,进行is或者==的比较

is 和 ==

a、is表示对比的是对象标识符(即内存地址),用来检查对象的标识符是否一致,即两个对象在内存中的地址是否一致(对象首字节的内存地址(你经常看到到的地址要么是十六进制展示的,要么就是十进制的))

b、在使用 strA is strB 的时候,相当于id(strA)== id(strB),因为字符串是不可变对象,所以又有字符串池的概念,所以is对比如果返回True,那么==也一定会返回True

1、==表示两个对象的值是否相等,相当于调用了__ eq__()这个魔法方法,即strA == strB 相当于 strA.__ eq__(strB)

str重写了__eq__方法

2、这次的话,我们再多介绍一个魔法方法__cmp__(一个Python3.x下已经遗弃的宝贝)

__ cmp__

a、int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 __cmp__的返回值进行排序(int、str也重写了 __ cmp __(python2.x下)

b、int、str现在已经废弃了__cmp__这个魔法(python3.x下)),废弃了__cmp__方法后,则新定义了 __ eq__, __ ne__, __ lt__, __ gt__ 等各种新的魔法方法

但是这个Python2.x下的知识点也要知道……,以下语法为Python2.x

但是,如果对一组 Person 类的实例对象需要排序时,就必须提供我们自己的特殊方法 cmp():

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Person(object):
def __init__(self, name, age):
self.name = name(http://www.amjmh.com)
self.age = age
def __str__(self):
return '(%s: %s)' % (self.name, self.age)
__repr__ = __str__

def __cmp__(self, other):
if self.name < other.name:
return -1
elif self.name > other.name:
return 1
else:
return 0

上述 Student 类实现了__ cmp__()方法,__cmp__用实例自身self和传入的实例 other 进行比较,如果 self 小于其他对象 ,就返回 -1,如果 s 大于其他对象,就返回1,如果两个对象相等,就返回 0。

这边为了加强理解,假设换成数字就更能明白-1、1、0的用意了,你想想看呢?

Person类实现了按name进行排序:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> L = [Person('Tim', 25), Person('Bob', 30), Person('Alice', 23)]
>>> print sorted(L)
[(Alice: 23), (Bob: 30), (Tim: 25)]

对于比较的字符串,按照字符的ASCII码进行比较,显然是按照第一位字符的ASCII码进行的比较
注意: 如果list中的元素不仅仅包含 Person 类的对象,则 __ cmp__ 会报错:

L = [Person('Tim', 25), Student('Bob', 30, 100, 'Hello']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值