python函数未返回正确的值

2024-09-30 02:23:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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。但它没有返回。当我打印cnt的值时,我看到了正确的值。但是当我返回它时,我得到的值是None


Tags: 函数nonereturnifdefreselseint
2条回答

您没有返回递归调用:

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

相反,您的函数只在那里结束,而返回None,这是函数没有显式return结尾的默认值。在

返回递归结果:

^{pr2}$

递归调用不会神奇地使调用帧也返回;对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

{cd4>输入已经用完了。如果只想进行整数除法,请使用//floor division操作符。在

您可能需要添加一些空白以提高可读性,else是可选的,因为如果if测试为真,您已经退出了函数。我

最后,您可以给cnt一个默认值,无需嵌套函数:

^{4}$

一个变体,python3闭包

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()  

对于python2闭包,传递列表

^{pr2}$

相关问题 更多 >

    热门问题