python链式比较操作_Python成为专业人士笔记–对象比较

专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com

链式比较

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

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”

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

不等于

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()和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函数里写异常处理代码也可以)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值