lu315702820 发表于 2021-10-21 23:34:59

and-or运算符

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

根据课后作业学到的,如果a<b为真,则应该返回print(a),但是为什么b也被打印出来了?

wp231957 发表于 2021-10-22 06:59:38

本帖最后由 wp231957 于 2021-10-22 09:38 编辑

a < b and print(a)这个返回None(和False不一样但是在or 条件里 不短路),所以or后面也要执行

傻眼貓咪 发表于 2021-10-22 09:59:48

本帖最后由 傻眼貓咪 于 2021-10-22 10:01 编辑

首先分成三个部分: a < b and print(a) or print(b)

print() 是打印函数,本身就返回值 None(None 表示 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 # 没有运行函数

jackz007 发表于 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) 同时得到了执行。
页: [1]
查看完整版本: and-or运算符