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条)

报告相同问题?

悬赏问题

  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?