不可思议,Python 的链式操作竟然可以这样
学习 Python 的过程中,有没有让你出乎意料的情景,在细品之后,又觉得情理之中呢?(有的话文末留言哈)我就遇到过,初见时不可思议,仔细学习之后,又觉得豁然开朗,Python 的链式操作就是这样的场景。
不可思议
比如说,你看到 True is False 的结果是 False, False is False 的结果是 True ,不会觉得有什么问题:
>>> True is False
False
>>> False is False
True
然后,当你你看到 True is False is False 的结果是 False,可能就觉得不可思议。
>>> True is False is False
False
>>>
因为无论是从前计算,还是从后计算,结果都应该是 True 啊:
>>> (True is False) is False
True
>>> True is (False is False)
True
>>>
豁然开朗
当认知和实际情况不一致的时候,恰恰是我们需要学修正自己的时候。这种操作属于链式操作,Python 的官方文档有解释:https://docs.python.org/3/reference/expressions.html#comparisons
翻译一下,大致意思就是 Python 中的比较运算与 C 语言不同,这些比较操作具有相同的优先级,该优先级低于任何算术,移位或按位运算。
这些比较操作包括 in, not in, is, is not, <, <=, >, >=, !=, ==
操作符,会产生 True 或 False 的结果,这些比较操作符号可以任意的链式比较,比如:x < y <= z
,x < y
与 y <= z
具有相同的优先级,不存在先计算 x < y
,得到结果后再与<=z
进行比较的情况,因此x < y <= z
与 x < y and y <= z
是等价的。
x < y and y <= z
中,如果 x < y
的结果是 False,那么 y <= z
根本不会被计算。
也就是说a op1 b op2 c ... y opN z
等价于 a op1 b and b op2 c and ... y opN z
,每一个表达式最多被执行一次。
注意,a op1 b op2 c
并不代表 a 和 c 有必然的关系,比如这样写x < y > z
也是合法的,虽然并不好看。
那么开始的问题就变得简单了:
True is False is False
相当于
(True is False) and (False is False)
结果自然就是 False。
相信,现在你已经明白了下面的现象:
>>> 1 in [0,1] == True
False
>>> not True in [True,False]
False
然后,我再分享一下链式操应用的好例子和坏例子。
好例子,一目了然:
if 0 < x < 1:
print("x in range (0,1)")
if 0 <= x < 1:
print("x in range [0,1)")
if x <= y <= z:
print("y in range [x,z]")
if x >= y >= 1:
print("y in range [1,x]")
if x == y == z:
print("x,y,z all equal")
坏例子,不知所云。我们应该避免这样写:
if x < y > z:
print("y > max(x,z)")
if x != y != z:
print("kinda looks like x,y,z all distinct, but may have x==z")
if 0 > x < y != z > 1:
print("WHY??")
if 0 < x > 1 >> y << 1 < z > 1:
print("please remove this from the language")
用法没问题,但可能让人产生疑问的,类似文章开头的例子,也尽量避免:
if 0 < x < y == z < 1:
print("x,y in (0,1) with x)
if x <= y <= z != 1:
print("y in range(x,z) with z != 1")
if x == y == z != 1:
print("x,y,z all equal something that isn't 1")
if x is y is z:
print("x,y,z all identical")
if x is y is z in [1, 2, 3]:
print("x,y,z all identical and in [1,2,3]")
最后的话
编程细节藏着真知,搞懂了就豁然开朗,希望这些知识对你有用。如果您喜欢这篇文章,请点赞、转发、关注,谢谢支持。