1
pabupa 2018-05-28 10:53:18 +08:00
>
(1 != 0) > 0 1 != (0 > 0) |
2
pabupa 2018-05-28 10:54:40 +08:00
`(1 != 0) > 0 ` `1 != (0 > 0)`
|
3
pabupa 2018-05-28 10:55:04 +08:00
嘿~怎么都没格式呀
|
4
lianyue 2018-05-28 10:56:11 +08:00
运算符优先级
|
5
Kiriz 2018-05-28 10:57:08 +08:00 via iPhone
< <= > >= 优先于 != ==
|
6
littleylv 2018-05-28 11:01:41 +08:00
>>> print 1 != (0 > 0)
True >>> print (1 != 0) > 0 True >>> print 1 != 0 > 0 False |
7
ihaveadrame OP |
8
chengluyu 2018-05-28 11:06:41 +08:00 9
搜的姿势不对,搜「 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 2018-05-28 11:07:47 +08:00 1
|
10
ihaveadrame OP @chengluyu 感谢~ (づ ̄ 3  ̄)づ
|
11
ihaveadrame OP @menc 涨姿势~
|
12
jmc891205 2018-05-28 11:10:50 +08:00
这个应该等价于 1!=0 and 0>0
|
13
VYSE 2018-05-28 11:11:15 +08:00
这跟运算优先级没关系, 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 2018-05-28 11:11:21 +08:00 via Android
1 != 0 > 0
<=> 1 != 0 && 0 > 0 |
15
littleylv 2018-05-28 11:11:52 +08:00
@ihaveadrame #7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说
@chengluyu #8 天呐还有这种特性?所以是: >>> print 1 != 0 > 0 False >>> print (1 != 0) and (0 > 0) False 跪了 |
17
xxxy 2018-05-28 11:18:42 +08:00
https://docs.python.org/2/reference/expressions.html#comparisons
总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行 |
18
ihaveadrame OP |
19
SuT2i 2018-05-28 11:23:58 +08:00
1 != 0 > 0 等价于 1!=0 and 0>0
|
20
yazoox 2018-05-28 11:34:13 +08:00
楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿......
|
21
VYSE 2018-05-28 11:39:45 +08:00
@ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断
|
22
karllynn 2018-05-28 11:59:59 +08:00
链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿
|
23
mayne95 2018-05-28 12:09:13 +08:00 via Android
前 6 楼全歪了,什么鬼。V 站不是这个水平吧🤣
|
24
ihaveadrame OP @VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。
|
25
ihaveadrame OP @yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教
|
26
Rob007 2018-05-28 17:08:19 +08:00
>>int(1 !=0 ) > 0
>>True |
27
ytmsdy 2018-05-28 17:11:38 +08:00
“茴” 字有几种写法??
|
28
wfd0807 2018-05-28 17:51:05 +08:00
py 的链式比较,哈哈,我非 pythoner 都知道。。。
|
29
laoyur 2018-05-28 18:31:04 +08:00
|
30
copie 2018-05-28 18:53:04 +08:00 1
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 2018-05-28 19:00:10 +08:00 1
接着 30 楼(不小心点回复了)
...................................................................运行第八行后的栈 res,......... 运行九局行返回结果 res 然后我们接着看 18 运行 18 之前的 栈 res,b,........| 运行 18 之后的 栈 b,res,........| 运行 20 之后的 栈 res,............| 然后返回 res 看完上面的运行步骤我们可以看到. 如果是一个"a>b>c" 这样的运算 Python 会理解为 a>b and b>c |
32
param 2018-05-29 00:33:43 +08:00 via Android
3 < 4 > 1 #True
( 3 < 4) > 2 #False 还有这种事? |
33
param 2018-05-29 00:33:57 +08:00 via Android
3 < 4 > 1 #True
( 3 < 4) > 1 #False 还有这种事? |
35
stanfordwang 2018-05-29 09:39:09 +08:00
涨知识了
|