qq_41904854 2019-10-24 10:36 采纳率: 36.4%
浏览 340
已采纳

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

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

  • 写回答

2条回答 默认 最新

  • 家在田塍 2019-10-29 02:04
    关注

    你提的这个问题非常好,可以清楚地反映出,你对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) 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?