python函数没有返回正确的值

时间:2015-02-09 14:58:40

标签: python function return

def myLog(x,b):
    def logCall(x,b,cnt):
        if (int(x) < b):
            return cnt
        else:
            cnt+= 1
            logCall(int((int(x)/b)),b,cnt)

    return logCall(x,b,0)

res=myLog(16,2)
print res

此函数应返回值4.但它返回None。当我打印cnt的值时,我看到正确的值。但是当我返回它时,我得到的值为无

2 个答案:

答案 0 :(得分:6)

您没有返回递归调用:

else:
    cnt += 1
    logCall(int((int(x)/b)),b,cnt)

你的功能只是在那里结束而你返回None,而不是明确的return结束的函数的默认值。

返回递归结果:

else:
    cnt += 1
    return logCall(int((int(x)/b)),b,cnt)

递归调用不会神奇地使调用帧返回;对logCall()的调用与任何其他函数调用一样,您仍然需要处理返回的值。

通过该更改,您的代码将返回预期值:

>>> def myLog(x,b):
...     def logCall(x,b,cnt):
...         if (int(x) < b):
...             return cnt
...         else:
...             cnt+= 1
...             return logCall(int((int(x)/b)),b,cnt)
...     return logCall(x,b,0)
... 
>>> myLog(16,2)
4

无需在整个地方使用int();你的输入已经是整数。如果您只想进行整数除法,请使用//地板除法运算符。

您可能希望添加一些空白以便于阅读,else是可选的,因为如果if测试为真,您已经退出该函数。 →

最后但同样重要的是,您可以为cnt提供默认值,无需嵌套您的函数:

def myLog(x, b, cnt=0):
    if x < b:
        return cnt
    return myLog(x // b, b, cnt + 1)

答案 1 :(得分:0)

变体,Python 3闭包;

def myLog(x,b):
    def logCall(cnt=0):
    nonlocal x
    if x < b:
        return cnt
    x /= b
    return logCall(cnt+1)
return logCall

res=myLog(16,2)
res()  

用于Python 2闭包,传递列表;

def myLog(l):
    def logCall(cnt=0):
    if l[0] < l[1]:
        return cnt
    l[0] /= l[1]
    return logCall(cnt+1)
return logCall

res=myLog(16,2)
res()