
1 pabupa May 28, 2018 > (1 != 0) > 0 1 != (0 > 0) |
2 pabupa May 28, 2018 `(1 != 0) > 0 ` `1 != (0 > 0)` |
3 pabupa May 28, 2018 嘿~怎么都没格式呀 |
4 lianyue May 28, 2018 运算符优先级 |
5 Kiriz May 28, 2018 via iPhone < <= > >= 优先于 != == |
6 U7Q5tLAex2FI0o0g May 28, 2018 >>> print 1 != (0 > 0) True >>> print (1 != 0) > 0 True >>> print 1 != 0 > 0 False |
7 ihaveadrame OP |
8 chengluyu May 28, 2018 搜的姿势不对,搜「 python chained comparision 」就可以搜到结果了: > Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false). 摘自 https://docs.python.org/3/reference/expressions.html 的 6.10 Comparisions。 |
9 menc May 28, 2018 |
10 ihaveadrame OP @chengluyu 感谢~ (づ ̄ 3  ̄)づ |
11 ihaveadrame OP @menc 涨姿势~ |
12 jmc891205 May 28, 2018 这个应该等价于 1!=0 and 0>0 |
13 VYSE May 28, 2018 这跟运算优先级没关系, PY 这点比较 tricky, 转换后实际是 1 != 0 and 0 > 0, 加括号后才当算数运算. https://stackoverflow.com/questions/18528431/what-is-the-meaning-of-true-true-false-in-python-and-how-to-find-out |
14 whoami9894 May 28, 2018 via Android 1 != 0 > 0 <=> 1 != 0 && 0 > 0 |
15 U7Q5tLAex2FI0o0g May 28, 2018 @ihaveadrame #7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说 @chengluyu #8 天呐还有这种特性?所以是: >>> print 1 != 0 > 0 False >>> print (1 != 0) and (0 > 0) False 跪了 |
17 xxxy May 28, 2018 https://docs.python.org/2/reference/expressions.html#comparisons 总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行 |
18 ihaveadrame OP |
19 SuT2i May 28, 2018 1 != 0 > 0 等价于 1!=0 and 0>0 |
20 yazoox May 28, 2018 楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿...... |
21 VYSE May 28, 2018 @ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断 |
22 karllynn May 28, 2018 链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿 |
23 mayne95 May 28, 2018 via Android 前 6 楼全歪了,什么鬼。V 站不是这个水平吧 |
24 ihaveadrame OP @VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。 |
25 ihaveadrame OP @yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教 |
26 Rob007 May 28, 2018 >>int(1 !=0 ) > 0 >>True |
27 ytmsdy May 28, 2018 “茴” 字有几种写法?? |
28 wfd0807 May 28, 2018 py 的链式比较,哈哈,我非 pythoner 都知道。。。 |
30 copie May 28, 2018 In [2]: dis.dis("a!=b>b") 1 0 LOAD_NAME 0 (a) 2 LOAD_NAME 1 (b) 4 DUP_TOP 6 ROT_THREE 8 COMPARE_OP 3 (!=) 10 JUMP_IF_FALSE_OR_POP 18 12 LOAD_NAME 1 (b) 14 COMPARE_OP 4 (>) 16 RETURN_VALUE >> 18 ROT_TWO 20 POP_TOP 22 RETURN_VALUE 上面是 Python 运行时的字节码;然后我们来解释一下每一行什么意思 LOAD_NAME a 可以理解将 a 压入运行时栈 运行第一行后的栈 a,......| 运行第二行后的栈 b,a,......| DUP_TOP 可以理解为把栈顶复制一份重新压入栈 运行第三行后的栈 b,b,a,......| ROT_THREE 可以理解为把原来栈顶放到第三个位 置,把原来二放到第一个位置,把原来第三放到第二位 置 运行第四行后的栈 b,a,b......| COMPARE_OP 这个就是进行 != 运算,将 b 弹出然后 获取 a 得到比较结果 res 后设置栈顶 运行第五行后的栈 res,b......| 如果 res 是 false 就跳到 18 运行第七行后的栈 b(后一个 b), b,......| |
31 copie May 28, 2018 接着 30 楼(不小心点回复了) ...................................................................运行第八行后的栈 res,......... 运行九局行返回结果 res 然后我们接着看 18 运行 18 之前的 栈 res,b,........| 运行 18 之后的 栈 b,res,........| 运行 20 之后的 栈 res,............| 然后返回 res 看完上面的运行步骤我们可以看到. 如果是一个"a>b>c" 这样的运算 Python 会理解为 a>b and b>c |
32 param May 29, 2018 via Android 3 < 4 > 1 #True ( 3 < 4) > 2 #False 还有这种事? |
33 param May 29, 2018 via Android 3 < 4 > 1 #True ( 3 < 4) > 1 #False 还有这种事? |
35 stanfordwang May 29, 2018 涨知识了 |