如题,前两天有人问我这个题没答对。尴尬,查漏补缺吧。希望看到的大牛帮忙解惑~谷歌失败后,一脸正经的发帖。
|
pabupaMay 28, 2018
1
>
(1 != 0) > 0 1 != (0 > 0) |
|
pabupaMay 28, 2018
2
`(1 != 0) > 0 ` `1 != (0 > 0)`
|
|
pabupaMay 28, 2018
3
嘿~怎么都没格式呀
|
|
lianyueMay 28, 2018
4
运算符优先级
|
|
KirizMay 28, 2018 via iPhone
5
< <= > >= 优先于 != ==
|
|
U7Q5tLAex2FI0o0gMay 28, 2018
6
>>> print 1 != (0 > 0)
True >>> print (1 != 0) > 0 True >>> print 1 != 0 > 0 False |
|
7
|
|
8
搜的姿势不对,搜「 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
|
|
10
@chengluyu 感谢~ (づ ̄ 3  ̄)づ
|
|
11
@menc 涨姿势~
|
|
jmc891205May 28, 2018
12
这个应该等价于 1!=0 and 0>0
|
|
VYSEMay 28, 2018
13
这跟运算优先级没关系, 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 |
|
whoami9894May 28, 2018 via Android
14
1 != 0 > 0
<=> 1 != 0 && 0 > 0 |
|
U7Q5tLAex2FI0o0gMay 28, 2018
15
@ihaveadrame #7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说
@chengluyu #8 天呐还有这种特性?所以是: >>> print 1 != 0 > 0 False >>> print (1 != 0) and (0 > 0) False 跪了 |
|
xxxyMay 28, 2018
17
https://docs.python.org/2/reference/expressions.html#comparisons
总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行 |
|
18
|
|
SuT2iMay 28, 2018
19
1 != 0 > 0 等价于 1!=0 and 0>0
|
|
yazooxMay 28, 2018
20
楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿......
|
|
VYSEMay 28, 2018
21
@ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断
|
|
karllynnMay 28, 2018
22
链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿
|
|
mayne95May 28, 2018 via Android
23
前 6 楼全歪了,什么鬼。V 站不是这个水平吧🤣
|
|
24
@VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。
|
|
25
@yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教
|
|
Rob007May 28, 2018
26
>>int(1 !=0 ) > 0
>>True |
|
ytmsdyMay 28, 2018
27
“茴” 字有几种写法??
|
|
wfd0807May 28, 2018
28
py 的链式比较,哈哈,我非 pythoner 都知道。。。
|
|
30
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
接着 30 楼(不小心点回复了)
...................................................................运行第八行后的栈 res,......... 运行九局行返回结果 res 然后我们接着看 18 运行 18 之前的 栈 res,b,........| 运行 18 之后的 栈 b,res,........| 运行 20 之后的 栈 res,............| 然后返回 res 看完上面的运行步骤我们可以看到. 如果是一个"a>b>c" 这样的运算 Python 会理解为 a>b and b>c |
|
paramMay 29, 2018 via Android
32
3 < 4 > 1 #True
( 3 < 4) > 2 #False 还有这种事? |
|
paramMay 29, 2018 via Android
33
3 < 4 > 1 #True
( 3 < 4) > 1 #False 还有这种事? |
|
stanfordwangMay 29, 2018
35
涨知识了
|