鱼C论坛

 找回密码
 立即注册
查看: 1955|回复: 22

[已解决]短路逻辑疑问

[复制链接]
发表于 2021-12-22 22:17:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:求表达式的值?
3 and 5 + True or False
结果是6     但应该先计算5 + True等于6 再计算3 and 6 等于6,最后是6 or False  等于6吧。  图片上的是错误的吧。
最佳答案
2021-12-22 22:41:56
本帖最后由 lightninng 于 2021-12-29 07:21 编辑

因为出现了反例,我的原答案可能不太对,具体请看15楼~~~

=======================================================
以下为12.22原答案
先说结论,试验结果和官方文档说的完全一致(当然,这是一句废话。。)
结论是:计算的时候,完全按照从左到右的顺序进行计算,所以严格来说是没有楼主说的那种优先级的,如果说有优先级,那也是严格的从左到右的优先级

先放一个官方文档里关于and 和or 的说明
https://docs.python.org/2/library/stdtypes.html
官方文档的5.2节,详细解释了and 和or 的作用
x or y         if x is false, then y, else x
x and y       if x is false, then x, else y
not x          if x is false, then True, else False

然后我的例子
>>> 5 + 0 and True
True
>>> 5 + (0 and True)
5
>>> 1 or 2 + True
1
>>> 0 or 2 + True
3
>>> 1 or 2 + d    # 注意此处的变量d我并未定义,仍然得到了结果1
1
>>> 0 or 2 + d    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined

1.从第一个、第二个和第三个例子对比可以,and 前面的部分计算完作为and 连接符左侧的x来进行判断,
2.从第四个和第五个例子可以看到,or连接符左侧如果为真,那么不论右侧是什么都不会运行
and连接符左侧如果为假,那么不论右侧是什么都不会运行
这里可以扩展出一个简化(gaoluan)代码的一个用法
表达式a  and 函数b

if 表达式a:
    函数b
上面的两段代码的功能相同,or 也可以这么玩~~~


所以,我个人的理解是,楼主的例子中,图片中的说法,和楼主的说法都不准确
这个例子中实际的运作是这样的  3 and 5 + True or False
1.先从左到右进行计算,and左侧是3,所以根据文档的规则x and y       if x is false, then x, else y,这里的x=3是True,所以这个表达式的值应该是and右侧的部分5 + True or False这个表达式的值
2.5 + True or False这个表达式同样从左往右,计算到or的时候, or左侧为5+True=6,根据文档的规则x or y       if x is false, then y, else x,所以这个表达式=6,最后得到整个表达式的值为6

多说一句,虽然看起来好像是先计算了5+True ,但仅仅这样理解是片面的,真正的规则只有一个,就是从左往右进行计算,然后严格按照and 和or 的逻辑判断规则进行计算

以上,如过说的有问题,欢迎讨论,我还是挺喜欢交流的,交流就是学习~~~




1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-22 22:41:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 lightninng 于 2021-12-29 07:21 编辑

因为出现了反例,我的原答案可能不太对,具体请看15楼~~~

=======================================================
以下为12.22原答案
先说结论,试验结果和官方文档说的完全一致(当然,这是一句废话。。)
结论是:计算的时候,完全按照从左到右的顺序进行计算,所以严格来说是没有楼主说的那种优先级的,如果说有优先级,那也是严格的从左到右的优先级

先放一个官方文档里关于and 和or 的说明
https://docs.python.org/2/library/stdtypes.html
官方文档的5.2节,详细解释了and 和or 的作用
x or y         if x is false, then y, else x
x and y       if x is false, then x, else y
not x          if x is false, then True, else False

然后我的例子
>>> 5 + 0 and True
True
>>> 5 + (0 and True)
5
>>> 1 or 2 + True
1
>>> 0 or 2 + True
3
>>> 1 or 2 + d    # 注意此处的变量d我并未定义,仍然得到了结果1
1
>>> 0 or 2 + d    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined

1.从第一个、第二个和第三个例子对比可以,and 前面的部分计算完作为and 连接符左侧的x来进行判断,
2.从第四个和第五个例子可以看到,or连接符左侧如果为真,那么不论右侧是什么都不会运行
and连接符左侧如果为假,那么不论右侧是什么都不会运行
这里可以扩展出一个简化(gaoluan)代码的一个用法
表达式a  and 函数b

if 表达式a:
    函数b
上面的两段代码的功能相同,or 也可以这么玩~~~


所以,我个人的理解是,楼主的例子中,图片中的说法,和楼主的说法都不准确
这个例子中实际的运作是这样的  3 and 5 + True or False
1.先从左到右进行计算,and左侧是3,所以根据文档的规则x and y       if x is false, then x, else y,这里的x=3是True,所以这个表达式的值应该是and右侧的部分5 + True or False这个表达式的值
2.5 + True or False这个表达式同样从左往右,计算到or的时候, or左侧为5+True=6,根据文档的规则x or y       if x is false, then y, else x,所以这个表达式=6,最后得到整个表达式的值为6

多说一句,虽然看起来好像是先计算了5+True ,但仅仅这样理解是片面的,真正的规则只有一个,就是从左往右进行计算,然后严格按照and 和or 的逻辑判断规则进行计算

以上,如过说的有问题,欢迎讨论,我还是挺喜欢交流的,交流就是学习~~~




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 22:42:59 | 显示全部楼层
你可以去查查优先级or>and>算术运算符
所以先看 or 这边为1
然后再是3 and 5
如果 and 两边都为真则返回最后一个值即为5
所以最后为5+1=6

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 09:59:48 | 显示全部楼层
小伤口 发表于 2021-12-22 22:42
你可以去查查优先级or>and>算术运算符
所以先看 or 这边为1
然后再是3 and 5

老师,算数运算符+的优先级高于and,and的优先级高于or吧。  不应该是先计算+,然后计算and,最后计算or吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 10:01:34 | 显示全部楼层
lightninng 发表于 2021-12-22 22:41
先说结论,试验结果和官方文档说的完全一致(当然,这是一句废话。。)
结论是:计算的时候,完全按照从左 ...

所以,应该是先计算算数运算符,然后再计算and,最后计算or。
对吧,老师。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 10:22:04 From FishC Mobile | 显示全部楼层
刘海儿 发表于 2021-12-23 09:59
老师,算数运算符+的优先级高于and,and的优先级高于or吧。  不应该是先计算+,然后计算and,最后计算or ...

没错,这题非常容易明白,只要自己动手做实验就一目了然:
print(3 and 8 + 12)
答案是:20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 10:25:02 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-12-23 10:26 编辑
刘海儿 发表于 2021-12-23 10:01
所以,应该是先计算算数运算符,然后再计算and,最后计算or。
对吧,老师。


先运行运算符 +,然后 and 优先级大于 or ,那么就会以左优先于右运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 13:59:40 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 10:22
没错,这题非常容易明白,只要自己动手做实验就一目了然:答案是:20

是的,忘记了可以自己编程验证了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 14:26:35 | 显示全部楼层
刘海儿 发表于 2021-12-23 09:59
老师,算数运算符+的优先级高于and,and的优先级高于or吧。  不应该是先计算+,然后计算and,最后计算or ...

俺不是老师哈,我也是来学习的,他们说的对,是我错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 17:16:44 | 显示全部楼层
刘海儿 发表于 2021-12-23 10:01
所以,应该是先计算算数运算符,然后再计算and,最后计算or。
对吧,老师。

仔细看,并没有先计算加法,是先从左侧开始判断,如果硬要加上优先级的话
3 and (5 + True or (False))
大概是这样,但其实文档说的很清楚了,请你仔细看看官方文档关于and 和or 的说明,然后再好好看看我的几个例子,我觉得这个问题不难理解~~~

不要以验证自己的对的为前提去考虑问题,要尝试去理解东西本身是怎么样的~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 17:19:41 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 10:22
没错,这题非常容易明白,只要自己动手做实验就一目了然:答案是:20

并没有先算加法。虽然看起来程序是那样运行的。

实际情况是,先判断and运算符前面的3是否为逻辑真,因为为逻辑真,所以才会去看and后面的内容,虽然表现出来的现象好像是先计算了8+12,也就是你们说的+的运算等级更高,但其实,只是根据and运算符从左到右运算的结果罢了,逻辑上是完全不同的东西~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 18:12:13 | 显示全部楼层
lightninng 发表于 2021-12-24 17:19
并没有先算加法。虽然看起来程序是那样运行的。

实际情况是,先判断and运算符前面的3是否为逻辑真,因 ...

好的,只是非常好奇运算符 + 优先级不是高于逻辑符 and 吗?

+ 是 12级
and 是 3级
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 19:09:00 | 显示全部楼层
本帖最后由 lightninng 于 2021-12-24 19:11 编辑
傻眼貓咪 发表于 2021-12-24 18:12
好的,只是非常好奇运算符 + 优先级不是高于逻辑符 and 吗?

+ 是 12级


首先感谢你,在看到不同意见时,谦虚的态度~~
个人认为没有优先级,所谓的优先级,只不过是and连接符的运算方式让人有了+的优先级高于and的假象,
但是我也想明白了,既然他和优先级的现象一样,那认为有优先级至少也不会影响使用
所以可以说是我自己的问题,我习惯追根溯源而已,官方文档里根本没提起过优先级的事~~

最后附上楼主这个问题如果有所谓的优先级,应该大概是怎么样的感觉
3 and (5 + True or (False))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 19:25:13 | 显示全部楼层
lightninng 发表于 2021-12-24 19:09
首先感谢你,在看到不同意见时,谦虚的态度~~
个人认为没有优先级,所谓的优先级,只不过是and连接符 ...

好的,谢谢你,笔记中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-29 07:19:51 | 显示全部楼层
我要重新修改我的答案了,还是我的观点放前面,优先级可能确实存在,但是因为还没想清楚逻辑,所以不敢随便下定论。
我不敢随意下结论了,今天做一个小工具的时候发现了一个反例如下:
>>> f = '~$新建 Microsoft Excel 工作表.xlsx'
>>> ("$" not in f) and f.split(".")[-1]=="xls" or f.split(".")[-1]=="xlsx"
True
本意是将文件名中不包含"$"的excel文件筛选出来,然而,如上面所示,并没有按照我的想法工作,于是我试了下面这个例子
>>> False and False or True
True
可以看到,似乎短路逻辑并没有起作用,因为按照短路逻辑,and 左侧判断为假之后就无需判断了,直接返回and 左侧的False
所以,我要更正我的观点,并对之前给讨论的几位带来的误导表示道歉~~~


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-29 07:22:52 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 10:22
没错,这题非常容易明白,只要自己动手做实验就一目了然:答案是:20

抱歉,可能我之前的判断有失误,发现了反例
False and False or True这个表达式是True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-29 07:59:54 From FishC Mobile | 显示全部楼层
lightninng 发表于 2021-12-29 07:22
抱歉,可能我之前的判断有失误,发现了反例
False and False or True这个表达式是True

好的,谢谢你,看来需要研究研究一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-29 13:41:22 | 显示全部楼层
本帖最后由 Stubborn 于 2021-12-29 13:50 编辑



我更加赞成这种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-29 14:14:29 | 显示全部楼层
本帖最后由 Stubborn 于 2021-12-30 14:13 编辑
lightninng 发表于 2021-12-24 19:09
首先感谢你,在看到不同意见时,谦虚的态度~~
个人认为没有优先级,所谓的优先级,只不过是and连接符 ...



The operator priority or precedence is important to evaluate arithmetic expression involving many operators. The order of evaluation of arithmetic operators is from left to right.

&#8206;运算符优先级或优先级对于计算涉及许多运算符的算术表达式非常重要。算术运算符的计算顺序是从左到右。&#8206;
题主的这里涉及到,算数运算符,和逻辑运算符


对于可以知道的结果,例如  1 or 0 。在左侧为真的情况下,程序可以直接发回,所以你的 1 or 2 + d 这里不会产生报错,因为后面不会处理。
对于不知道的结果,例如 1 and 2 ,在左侧为真的情况下,程序必须处理完右侧才能知道结果。


题主这样的  3 and 5 + True or False   测试: 3 and 5 + True or 3 + d 并未报错。
我比较倾向的解释流程是。从左到右,有结果就出结果。 expression1 and expression2 or expression3 not expression4
处理 3 是真,处理右侧
处理 5 + True 是 6,也是真 返回 6
这里就变成了 6 or False 直接返回6


如果觉得解释器看起来比较麻烦,可以看下更加简单一些的,计算器程序:https://fishc.com.cn/thread-170706-1-1.html
原则上这个就和处理计算一串字符串的算式一样

也有优先级 + - / *  (  ) 但是从程序的角度来说,总是左到右。优先也只是说我需要它的结果,所以才优先处理。

譬如这个算数式  2 + 2 * 3 - 5   看做  2 and 2 * 3 or 5







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-31 11:56:17 | 显示全部楼层
Stubborn 发表于 2021-12-29 14:14
The operator priority or precedence is important to evaluate arithmetic expression involving m ...


事实上我发现了反例~~
看16楼,这个例子中and前的 false 并未直接停止判断,所有个人暂时的看法是,还是有优先级存在的,或者说,把哪些部分短路了是需要注意的~~
我之前的理解是,and前面有Flase,那后面的部分直接不看了,,,,然而并非如此~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表