2013-07-04 156 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子句返回。