2014-12-03 45 views
0

Python似乎无法将数字的正确值返回为零的幂。 当我给它一个文字方程时,它可以正常工作,但对于任何比原始数字更复杂的任何事物,它总是返回正数1。
下面是一些测试:0指数方程式上的符号故障

>>> -40 ** 0 # this is the correct result 
-1 
>>> (0 - 40) ** 0 # you'd expect this to give the same thing, but... 
1 
>>> a = -40 # let's try something else... 
>>> a ** 0 
1 
>>> int(-40) ** 0 # this oughtn't to change anything, yet... 
1 
>>> -66.6 ** 0 # raw floats are fine. 
-1.0 
>>> (0 - 66.6) ** 0.0 # ...until you try and do something with them. 
1.0 

UPDATE:pow()给出了这样的结果,也因此可能是第一个结果是例外...

>>> pow(-60, 0) 
1 

难道是有些问题,符号的整数?我需要一个值为1,-1或0的三元开关,具体取决于输入是正值还是负值,或者是零。我能做到同样的事情类似:

if val > 0: switch = 1 
elif val < 0: switch = -1 
else:   switch = 0 

...然后使用变量开关我的目的。
但是这并不能回答我关于Python如何处理零功耗的问题。
(我也将接受-40 ** 0只返回-1 意外(惊人),但我怀疑这样的话......)

+1

任何引起'0'的幂的非零整数应该返回一个'+ 1'。所以'(0-40)** 0'正确地产生了一个'+ 1'。 “-40 ** 0”返回一个“-1”的原因是因为**比'-'更强烈地与'40'结合。 – eigenchris 2014-12-03 20:53:49

+0

那么我认为'a = -60; a ** 0 - > 1'评估为“(-60)** 0”?这对我来说很有意义。 – Augusta 2014-12-03 21:37:04

+0

这是正确的。 :) – eigenchris 2014-12-03 21:38:53

回答

4

Python是正确的,并做你期望它做的事情。这是一个操作顺序问题。任何数字(正数或负数)等于零。但是请记住,乘法是在减法运算之前进行的。因此,在更详细,什么Python看到是这样的: 第一种情况:

-40 ** 0 = -(40 ** 0) = -(1) = -1 

第二种情况:

(0 - 40) ** 0 = (-40) ** 0 = 1 

在5日的情况下,以及它与括号做

int(-40) ** 0 = (-40) ** 0 = 1 
+0

啊,我明白了。感谢您向我解释这一点。我认为第一个例子(就是那个给我想要的东西)可能是特例,但是希望它不是。 我想'a = -60;一个** 0 - > 1'将被评估为'(-60)** 0',也可以解析为+1 ... 嗯......该死的。 – Augusta 2014-12-03 21:40:50

1

在这个问题就stumpled,我不明白的语法。

但我不认为(-40)^ 0 = -40^0。

在左侧,指数是最后一个操作。这就是为什么左侧应该等于1. 在右侧,减号是最后的操作。这就是为什么结果应该是-1。

1

这里没有任何问题。每个号码power01

在蟒蛇象星座-.+,...有较少的优先级电源(**),所以当你把0 - 40的圆括号内你有(-1)**01但是当你做-1**0首先你必须1**0然后-

>>> (0-4)**0 == (-1)**0 == 1 
>>> -1**0 == -(1**0) == -1