2013-07-04 131 views
0

我有这个小函数需要两个整数ab并检查是否ab上升到某个指数。这是代码。为什么不python返回布尔值

def is_power(a,b): 

    if not a%b==0: 
     return a%b==0 

    elif a/b==1: 
     return a/b==1 

    else: 
     a = a/b 
     is_power(a,b) 

print is_power(,) 

问题是无论我输入什么,总是返回None

但是,如果我用印刷品替换所有退货,那么它们会给出正确的结果,即TrueFalse

def is_power(a,b): 

    if not a%b==0: 
     print a%b==0 

    elif a/b==1: 
     print a/b==1 

    else: 
     a = a/b 
     is_power(a,b) 

is_power(,) 

为什么会发生这种情况?这可能是一个noob问题,但我仍然无法想象出来。 感谢

+1

你是否在函数的最后一行缺少'return'? – bbayles

+0

是的,他错过了一个return语句。另外,你是否在没有参数的情况下调用函数,或者是Harry Houdini的参数亲属? –

+0

@JohnDoe:没有功能不是没有参数。我根本没有在那里放任何价值。 – Mishrito

回答

8

你忽略了递归调用的返回值,添加一个return有:

else: 
    a = a/b 
    return is_power(a,b) 

没有return声明那里,你的函数只是结束并返回None代替。递归调用的返回值被忽略。

随着return声明,您的代码工作:

>>> def is_power(a,b): 
...  if not a%b==0: 
...   return a%b==0 
...  elif a/b==1: 
...  return a/b==1 
...  else: 
...   a = a/b 
...   return is_power(a, b) 
... 
>>> print is_power(10, 3) 
False 
>>> print is_power(8, 2) 
True 
+0

谢谢,如果我在最后一个else子句中添加返回值,它确实有效。但是我在理解执行流程方面仍然有点麻烦。如果'a'是'b'的权力,那么最终它会达到第二个条款,它有一个返回语句。如果不是,那么它会在第一个if子句中停止,该子句再次返回False。无论哪种情况,函数都会返回前两个子句中的一个,每个子句都返回一个值。为什么应该在last else子句中的函数调用之前插入'return'?感谢您的耐心 – Mishrito

+0

@Mishrito:您忘记了当'is_power()'自己调用它时,那个调用返回时,控制返回到先前调用'is_power()',**而不是**调用第一个' is_power()'函数。所以在最后的'else'块中,当递归'is_power()'调用完成时,控制返回到那个点。在那个时候,你的代码会丢弃返回的任何递归调用。该函数在那里结束,返回“None”,实际上忽略了递归调用结果。 –

+0

啊明白了。感谢您的解释。我试图教自己蟒蛇,有时它可能会困难缠绕这些东西。再次感谢耐心 – Mishrito

5

你忘了在最后else子句返回。