鱼C论坛

 找回密码
 立即注册
查看: 1815|回复: 6

[已解决]新手求助大神解答短路逻辑问题!(刚不懂,把主题售价当做打赏回答了,见笑了)

[复制链接]
发表于 2017-9-5 21:52:31 | 显示全部楼层 |阅读模式

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

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

x
#代码:
def a():
    print('A')
    return []
def b():
    print ('B')
    return []
def c():
    print ('C')
    return 1
def d():
    print ('D')
    return []
def e():
    print ('E')
    return 1
def f():
    print('F')
    return 1
def g():
    print('G')
    return []
def h():
    print ('H')
    return 1
if a() and b() and  c() and d() or e() and f() or g() and h():
    print ('ok')

#输出结果如下:
    A
    E
    F
    ok
#解析:
别以为语句很长就很难,我们好好分析一下,从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。最终只打印了A E F ok 。

#疑问
为何没有考虑到优先级问题
(a() and b() and  c() and d() )  or  (e() and f() )  or   (g() and h())
如何考虑优先问题 输入的结果应该是:
    A
    F
    G
    ok

#逻辑
(a() and b() and  c() and d() )输出A后逻辑短路
(e() and f() ) Ture and Ture 输出F
(g() and h())输出G

0 or 1 or 0 == 1  输出ok


同理 课后习题6后课题:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
如果不考虑优先级应该是9吧
但是考虑优先级 ,结果输出的是4
请问这里的优先级and or  为何要考虑?

最佳答案
2017-9-5 22:18:35
这里考虑优先级了,当执行函数返回[]会判定为False
其实python没有你想象的那么智能,它从左往右执行a()执行了一次函数,所以print(A)就打印A了,但是执行结果是[],and后面的bcd也就不会执行了,也就是or前面全部判断为False,所以or后面的语句就会被执行。e()和f()因为e返回TURE,and后面的f()就会执行,因为e()andf()判断为Ture,所以根据or的短路逻辑,第二个or后面的语句就不会执行了
手机打这么多字真费劲
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-9-5 22:18:35 From FishC Mobile | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

这里考虑优先级了,当执行函数返回[]会判定为False
其实python没有你想象的那么智能,它从左往右执行a()执行了一次函数,所以print(A)就打印A了,但是执行结果是[],and后面的bcd也就不会执行了,也就是or前面全部判断为False,所以or后面的语句就会被执行。e()和f()因为e返回TURE,and后面的f()就会执行,因为e()andf()判断为Ture,所以根据or的短路逻辑,第二个or后面的语句就不会执行了
手机打这么多字真费劲
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 22:19:50 | 显示全部楼层
短路逻辑
例1:(1-1) and (0+1)  #1-1 = 0吧=False;那么and中有一个为0那么整个就为0了对吧。这个时候还用得着计算后面的0+1吗?

例2:(1+1) or (1-1)  #同样的这里1+1=2为True了。or完后,还是要执行后面的代码块;那么1-1也没必要计算了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-5 23:10:40 | 显示全部楼层
ba21 发表于 2017-9-5 22:19
短路逻辑
例1:(1-1) and (0+1)  #1-1 = 0吧=False;那么and中有一个为0那么整个就为0了对吧。这个时候还 ...

感谢~~!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-5 23:12:41 | 显示全部楼层
左手十字 发表于 2017-9-5 22:18
这里考虑优先级了,当执行函数返回[]会判定为False
其实python没有你想象的那么智能,它从左往右执行a()执 ...

感谢! fishc.com 有APP了?手机打这么多字确实不容易,感谢大佬出手相助,感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 23:13:34 From FishC Mobile | 显示全部楼层
人工智能 发表于 2017-9-5 23:12
感谢! fishc.com 有APP了?手机打这么多字确实不容易,感谢大佬出手相助,感谢!

网页版的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-5 23:53:13 | 显示全部楼层


哇~~\(≧▽≦)/~


再次感谢~
你的文字描述能力好强
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-2 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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