Python成为专业人士笔记–对象比较

专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!

链式比较

您可以使用多个比较操作符对多个变量进行链式比较,例如:

        x > y > z 
      

它是下面语句的简短形式:

         x > y and y > z
      

只有当两个比较都为真时,这个值才为真

其形式一般为:

        a OP b OP c OP d …
      

其中OP表示可以使用的多个比较操作之一,而a、b这些字母表示任意有效表达式。

注意,0 != 1 != 0的计算结果为True,即使0 != 0为False(见前面简短形式拆解后)。不像普通的数学符号x != y != z表示x、y和z有不同的值

比较代码的风格

只要语法正确,对于使用多少变量进行比较操作没有理论上的限制

        1 > -1 < 2 > 0.5 < 100 != 24
      

如果每个比较都返回True,则上面的代码返回True。然而,使用超长的链式比较不是一种好的代码风格,因为长链将导致可读性不强,一个好的链式比较代码不会特别复杂,且有明确的链式向后的比较方向:

        1 > x > -4 > y != 8   #顺序向后比较
      

意外情况

一旦一个变量比较返回False,表达式立即计算为False,并跳过所有剩余的比较

注意 变量exp在“a> exp > b”中,如果a>exp已经被证明是False了,表达式将会立刻返回而不会继续判断

is 和 ==

注意:下面描述只针对Pthon2,而在python3中,is和==是完全等价的

一个常见的陷阱是混淆相等“==”比较运算符和“is”运算符

a == b比较a和b的值

a is b 将会比较两个对象的引用

用代码说明:

         a = 'Python is fun!'
 b = 'Python is fun!'
 a == b # 返回 True
 a is b # 返回 False 因为是两个不同的对象

 a = [1, 2, 3, 4, 5]
 b = a # 将a对象的引用赋给b
 a == b # True
 a is b # True  因为两个对象是同一个引用了

 b = a[:]
 #注意:这里是把a对象的值,复制一份给到b
 a == b # True
 a is b # False 两个仍然不是相同的对象引用
      

基本上,可以将is看作id(a) == id(b)的简写

除此之外,python运行时环境的一些设定会使事情变得更加复杂。与is相比,短字符串和很小的整数将返回True,因为Python试图会为相同的对象使用更少的内存,而将它们指向同一个引用

         a = 'short'
 b = 'short'
 c = 5
 d = 5
 a is b # True
 c is d # True
 #注意,这是python运行时环境的问题,因为他们内容太短所以会分配到同一块内存引用

      

但较长的字符串和较大的整数将在内存中分别存储:

         a = 'not so short'
 b = 'not so short'
 c = 1000
 d = 1000
 a is b # False
 c is d # False
      

大于或小于

这些操作符比较两种类型的值,它们是小于操作符和大于操作符;对于数字类型的比较,这只是比较数值,看看哪个更大

         12 > 4
 #True
 12 < 4
 #False
 1 < 4
 #True
      

对于字符串,它们将按字母顺序进行比较,但对于大小写字母的处理会有些不同,看下面的例子:

         "alpha" < "beta"
 #True
 "gamma" > "beta"
 #True

 "gamma" < "OMEGA"
 #False  这里输出False了?发生了什么?
      


在这些比较中,小写字母被认为是“大于”大写字母的,这就是为什么“gamma”<“OMEGA”返回False;如果它们都是大写的,它将返回预期的字母排序结果

每种类型使用<和>操作符定义其计算,因此使用具体类型之前,应该研究这些操作符的含义。

不等于

        x != y 
      

如果x和y不相等,则返回True,否则返回False

         12 != 1
 #True
 12 != '12'
 #True
 '12' != '12'
 #False
      

等于

        x == y
      

这个表达式计算x和y是否相同,并以布尔值的形式返回结果;通常类型和值都需要匹配,所以数值 12和字符串“12”是不一样的

         12 == 12
 #True
 12 == 1
 #False
 '12' == '12'
 #True
 'spam' == 'spam'
 #True
 'spam' == 'spam '
 #False

 #'12' == 12
 # False 注意,类型不一样
      

请注意,在python中每种类型都定义了内置的函数,该函数将用于评估两个值是否相同;对于内建类型,这些函数的行为与您所期望的一样,只是根据相同的值来计算。然而,自定义函数可以将相等性判断定义为它们想要的任何东西,包括总是返回True或总是返回False。

自定义比较函数

为了自定义的比较相等性,您可以通过定义eq和ne方法来覆盖==和!=操作符。您还可以覆盖lt(<)、le(<=)、gt(>)和ge(>)。注意,您只需要覆盖比较方法即可,而Python可以处理其余的操作,如“==”与“ not < and not > ”的表达式等价这样的内置处理。

         class Foo(object):
       def __init__(self, item):
           self.my_item = item

       def __eq__(self, other):
           return self.my_item == other.my_item

 a = Foo(5)
 b = Foo(5)
 a == b # True 这里调用了eq函数,根据业务逻辑需要,我完全可以让他返回False
 a != b # False
 a is b # False
      

注意,这个简单的比较假设other(与之比较的对象)是相同的对象类型。与另一种类型比较将抛出错误 (当然,如果你愿意在eq函数里写异常处理代码也可以)

今天的分享就到这里,禁止转载,违者必究!

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106211753