加了小括号的表达式,为什么没有先运行?

如图,右边表达式加了小括号,为什么还是先执行左侧?图片说明

你提的这个问题非常好,可以清楚地反映出,你对python中“表达式评估顺序”和“运算符顺序”的概念混淆了,
关于两者的概念和区别,需要你很用心的查找资料。我在这里只能部分给你一些启发,通过运行这些与你问题类似的代码,
来帮你初步理解他们的作用和区别。希望你认真跑一下这个程序,阅读其中的注释,比较一下结果,祝你好运!希望对你
有所启发和帮助。

def a():
    print('a')
    return 10
def b():
    print('b')
    return 10
def c():
    print('c')
    return 10
def d():
    print('d')
    return 10
#首先需要弄清楚python 中的表达式评估顺序和运算符顺序两者的概念以及他们的区别。
#python中,采用“先评估表达式,再运算表达式”的逻辑。
#python中,只有赋值语句比较特殊,它是先评估赋值符号“=”右边的表达式,除此以外,所有的表达式评估顺序都是从左向右的。
#不妨通过例子来说明,更容易理解他们的区别。
print('示例1:')
value=a()-(b()+(c()*d()))
print(value)#此例子中,先从左向右评估表达式,即分别执行a(),b(),c(),d();随后,用前面获得的评估值进行运算,此时运算符的优先级顺序才体现出来,即10-(10+(10*10))=-100;所以结果是,先打印a,b,c,d,而后才输出运算结果-100。

print('示例2:')
value=a()+b()==(c()*d())
print(value)#再来看你这个例子,先从左向右评估表达式,所以依次执行a(),b(),c(),d();随后,将返回值带到表达式中运算,获得结果为false。

#不知道你看出来了没有,python一般是先从左向右评估表达式,获得他们的值之后,再进行运算,在运算阶段才考虑运算顺序。
#再来看几个有趣并且常常令人困惑的运算符,and ,or 以及 & ,|,你会对评估表达式的概念理解更进一步。
#and,从左到右评估,如果and前面的表达式为false,那么and后面的表达式将不会被评估,也就是不会被执行。
print('示例3:') 
value=0 and a()
print(value)# 在评估阶段,发现0已经是false了,那么该and布尔表达式已经为0,因此and之后的a()将不会被评估。

print('示例4:')
value=a() and (a()+(b()+(c()*d()))) 
print(value)# 从左向右评估,and 左面的值为10,即为True,那么接着评估右面,依次先获得值;而后运算,获得结果。

# or,从左向右评估,如果or的左面为True,那么or后面将不会评估;如果左面为False,再评估右面。
print('示例5:')
value=0 or a()+b() 
print(value)#先从左向右评估,发现左面为0,继续评估,a(),b()先后运行得到10,10;随后运算,由于or优先级低于+,因此获得0 or 20的结果,最终输出20.

print('示例6:')
value=a() or a()+b()*c()
print(value)# 从左向右评估,发现a()已经是10,为True,所以不再进行评估。输出结果10。

#将上述 and换为&,以及or换成|,看看运行结果,你发现了什么不同?思考一下他们的区别吧!好好查查资料。
print('示例7:')
value=0 & a()
print(value)

print('示例8:')
value=a() & (a()+(b()+(c()*d())))
print(value)

print('示例9:')
value=0 | a()+b() 
print(value)

print('示例10:')
value=a() | a()+b()*c()
print(value) 

因为是==号左侧也有运算,会先运算==号左侧,你全部放在右侧,再试试