【问题标题】:How does the following expression work in python? [duplicate]以下表达式如何在 python 中工作? [复制]
【发布时间】:2021-04-08 03:44:55
【问题描述】:

以下表达式在 python 中是如何工作的?

>>> 1 ++++++++++++++++++++ 1
2
>>> 1 ++++++++++++++++++++-+ 1
0

我认为这会引发SyntaxError,但事实并非如此。

【问题讨论】:

  • 一般情况下,通过import ast; print(ast.dump(ast.parse('1 +++-+ 1', mode='eval'), indent=4))传递表达式,自己看看。

标签: python


【解决方案1】:

查看 Python data modeloperator precedence。您会发现 __neg____pos____abs____invert__ 的魔术方法都采用一个参数。除了__abs__,这些都是作为操作符实现的,- 用于__neg__+ 用于__pos__~ 用于__invert__。查看运算符优先级,它们比任何二元算术运算符绑定得更紧密。 __pos__ 只是返回未更改的 int,而 __neg__ 返回相同的 int 但其符号已更改。所以解释器只是一遍又一遍地重复应用该操作,直到它最终找到一个左操作数并实际进行一些算术运算。

【讨论】:

    【解决方案2】:

    python中没有post / pre increment / decrement operators

    我们可以将++-- 视为多个符号相乘,就像我们在数学中所做的那样。 (-1) * (-1) = (+1).

    所以第一个表达式的计算结果为(1)+ (+1)= 2

    另一个,(+1) + -(+1)=(+1)-(+1)=1-1=0

    更多信息请见here

    【讨论】:

      【解决方案3】:

      你在玩python真是太棒了。一开始我也很惊讶。但仔细想想,这只是简单的数学!在数字前面给出多少加号并不重要。它保持不变。

      ++++++++++++++(1) = 1
      

      但如果有任何减号,这很重要。

      +++++++++-(1) = -1
      

      (括号只是为了清楚起见)所以在你的第一个代码中,值不会改变,因为只有加号。但是在第二个中,1 的值变为 -1,因为有一个减号。所以结果为零。但是如果有两个减号,结果将是 2。因为 -- = +。

      >>> 1 +++++++++++++-- 1
      2
      

      【讨论】:

        【解决方案4】:

        你必须使用括号和算术运算的逻辑来进行这种计算。

        1--2变成,

        1-(-(2)) = 1-(-2)
                 = 1+2
                 = 3
        

        1+++1 变成,

        1+(+(+1)) = 2
        

        1++-1 变成,

        1+(+(-1)) = 0
        

        【讨论】:

          最近更新 更多