鱼C论坛

 找回密码
 立即注册
查看: 1553|回复: 3

[已解决]and-or运算符

[复制链接]
发表于 2021-10-21 23:34:59 | 显示全部楼层 |阅读模式

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

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

x
>>> a = 5
>>> b = 6
>>> a < b and print(a) or print(b)
5
6

根据课后作业学到的,如果a<b为真,则应该返回print(a),但是为什么b也被打印出来了?
最佳答案
2021-10-22 11:00:55
本帖最后由 jackz007 于 2021-10-22 15:30 编辑

     首先需要明确以下几条知识:
    1、用 and 连接两个表达式,只有在两个表达式的值都是 True  的情况下,整个表达式的值才会是 True。 所以,当左表达式为 True  时,决定权就在右表达式上,就需要继续测试右表达式;当左表达式为 False 时,整个表达式的值就已经被锁定在 False 上,也就无需继续测试右表达式的值了。
    2、用 or  连接两个表达式,只有在两个表达式的值都是 False 的情况下,整个表达式的值才会是 False。所以,当左表达式为 False 时,决定权就在右表达式上,就需要继续测试右表达式;当左表达式为 True  时,整个表达式的值就已经被锁定在 True  上,也就无需继续测试右表达式的值了。
    3、print() 的返回值为 None,对应的布尔值为 False。
    4、运算符优先级的顺序是沿 < 、and 、or 的方向降低
    有了这些知识再来看这个表达式:
a < b and print(a) or print(b)
    首先,会先确定下面表达式的值
a < b and print(a)
    a < b 的值为 True,需要继续测试右表达式 print(a),print(a) 的值为 False。所以,整个 and 表达式的值是 False。这时,整个表达式变为:
False or print(b)
    左表达的值为 False,需要继续测试右表达式 print(b)。正是由于这些理由,使得 print(a) 和 print(b) 同时得到了执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-22 06:59:38 From FishC Mobile | 显示全部楼层
本帖最后由 wp231957 于 2021-10-22 09:38 编辑

a < b and print(a)这个返回None  (和False不一样  但是在or 条件里 不短路),所以or后面也要执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-10-22 09:59:48 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-22 10:01 编辑
首先分成三个部分: a < b and print(a) or print(b)

print() 是打印函数,本身就返回值 NoneNone 表示 False
所以以上代码可以理解成:True and False or False

代码: a < b and print(a) or print(b) 其实除了判断真假以外,另外还运行了代码 print()
这是因为有括号的 print() 表示运行函数,没有括号的 print 表示不要运行函数,所以这里运行了两次 print(),如:
def function():
    print("小白")

function() # 运行函数
小白

def function():
    print("小白")

function # 没有运行函数
 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 11:00:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-10-22 15:30 编辑

     首先需要明确以下几条知识:
    1、用 and 连接两个表达式,只有在两个表达式的值都是 True  的情况下,整个表达式的值才会是 True。 所以,当左表达式为 True  时,决定权就在右表达式上,就需要继续测试右表达式;当左表达式为 False 时,整个表达式的值就已经被锁定在 False 上,也就无需继续测试右表达式的值了。
    2、用 or  连接两个表达式,只有在两个表达式的值都是 False 的情况下,整个表达式的值才会是 False。所以,当左表达式为 False 时,决定权就在右表达式上,就需要继续测试右表达式;当左表达式为 True  时,整个表达式的值就已经被锁定在 True  上,也就无需继续测试右表达式的值了。
    3、print() 的返回值为 None,对应的布尔值为 False。
    4、运算符优先级的顺序是沿 < 、and 、or 的方向降低
    有了这些知识再来看这个表达式:
a < b and print(a) or print(b)
    首先,会先确定下面表达式的值
a < b and print(a)
    a < b 的值为 True,需要继续测试右表达式 print(a),print(a) 的值为 False。所以,整个 and 表达式的值是 False。这时,整个表达式变为:
False or print(b)
    左表达的值为 False,需要继续测试右表达式 print(b)。正是由于这些理由,使得 print(a) 和 print(b) 同时得到了执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 23:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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