专业人士笔记”系列目录:创帆云: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函数里写异常处理代码也可以)
今天的分享就到这里,禁止转载,违者必究!