不可思议,Python 的链式操作竟然可以这样

开发 后端
学习 Python 的过程中,有没有让你出乎意料的情景,在细品之后,又觉得情理之中呢?(有的话文末留言哈)我就遇到过,初见时不可思议,仔细学习之后,又觉得豁然开朗,Python 的链式操作就是这样的场景。

[[434237]]

学习 Python 的过程中,有没有让你出乎意料的情景,在细品之后,又觉得情理之中呢?(有的话文末留言哈)我就遇到过,初见时不可思议,仔细学习之后,又觉得豁然开朗,Python 的链式操作就是这样的场景。

不可思议

比如说,你看到 True is False 的结果是 False, False is False 的结果是 True ,不会觉得有什么问题:

  1. >>> True is False 
  2. False 
  3. >>> False is False 
  4. True 

然后,当你你看到 True is False is False 的结果是 False,可能就觉得不可思议。

  1. >>> True is False is False 
  2. False 
  3. >>> 

因为无论是从前计算,还是从后计算,结果都应该是 True 啊:

  1. >>> (True is Falseis False 
  2. True 
  3. >>> True is (False is False
  4. True 
  5. >>> 

豁然开朗

当认知和实际情况不一致的时候,恰恰是我们需要学修正自己的时候。这种操作属于链式操作,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 也是合法的,虽然并不好看。

那么开始的问题就变得简单了:

  1. True is False is False 

相当于

  1. (True is Falseand (False is False

结果自然就是 False。

相信,现在你已经明白了下面的现象:

  1. >>> 1 in [0,1] == True 
  2. False 
  3. >>> not True in [True,False
  4. False 

然后,我再分享一下链式操应用的好例子和坏例子。

好例子,一目了然:

  1. if 0 < x < 1: 
  2.     print("x in range (0,1)"
  3.  
  4. if 0 <= x < 1: 
  5.     print("x in range [0,1)"
  6.  
  7. if x <= y <= z: 
  8.     print("y in range [x,z]"
  9.  
  10. if x >= y >= 1: 
  11.     print("y in range [1,x]"
  12.  
  13. if x == y == z: 
  14.     print("x,y,z all equal"

坏例子,不知所云。我们应该避免这样写:

  1. if x < y > z: 
  2.     print("y > max(x,z)"
  3.  
  4. if x != y != z: 
  5.     print("kinda looks like x,y,z all distinct, but may have x==z"
  6.  
  7. if 0 > x < y != z > 1: 
  8.     print("WHY??"
  9.  
  10. if 0 < x > 1 >> y << 1 < z > 1: 
  11.     print("please remove this from the language"

用法没问题,但可能让人产生疑问的,类似文章开头的例子,也尽量避免:

  1. if 0 < x < y == z < 1: 
  2.     print("x,y in (0,1) with x<y and z==y"
  3.  
  4. if x <= y <= z != 1: 
  5.     print("y in range(x,z) with z != 1"
  6.  
  7. if x == y == z != 1: 
  8.     print("x,y,z all equal something that isn't 1"
  9.  
  10. if x is y is z: 
  11.     print("x,y,z all identical"
  12.  
  13. if x is y is z in [1, 2, 3]: 
  14.     print("x,y,z all identical and in [1,2,3]"

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2023-04-06 09:44:00

ChatGPT行业质量

2013-10-10 13:07:25

方物

2024-04-07 00:00:00

亿级数据ES

2017-03-21 08:52:20

神经网络声誉

2011-02-23 08:50:22

C#.NETdynamic

2022-01-24 15:57:34

Python返回功能代码

2010-07-15 16:21:03

不可思议的服务器

2020-07-02 15:40:11

Spring BootJar包Java

2011-07-18 13:35:14

HTML 5

2013-07-31 15:06:58

未来的WebWebGLWeb

2014-07-26 22:18:51

2014-01-14 10:33:42

开源硬件开源

2012-02-13 11:01:27

N9Android 4.0

2017-11-08 14:07:45

数据库MySQL慢查分析

2016-07-06 11:56:52

思科汉堡光纤骨干网

2012-05-16 17:28:32

智能手机

2023-04-04 22:31:11

GPT-5人工智能

2021-03-03 07:12:47

Windows10操作系统微软

2014-11-13 10:08:21

2020-09-16 10:24:37

物联网环保应用IOT
点赞
收藏

51CTO技术栈公众号