2024-09-30 02:23:29 发布
网友
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
您没有返回递归调用:
else: cnt += 1 logCall(int((int(x)/b)),b,cnt)
相反,您的函数只在那里结束,而返回None,这是函数没有显式return结尾的默认值。在
None
return
返回递归结果:
递归调用不会神奇地使调用帧也返回;对logCall()的调用是,就像任何其他函数调用一样,您仍然需要处理返回的值。在
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测试为真,您已经退出了函数。我
else
if
最后,您可以给cnt一个默认值,无需嵌套函数:
cnt
一个变体,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闭包,传递列表
您没有返回递归调用:
相反,您的函数只在那里结束,而返回
None
,这是函数没有显式return
结尾的默认值。在返回递归结果:
^{pr2}$递归调用不会神奇地使调用帧也返回;对
logCall()
的调用是,就像任何其他函数调用一样,您仍然需要处理返回的值。在通过该更改,代码将返回预期值:
{cd4>输入已经用完了。如果只想进行整数除法,请使用
//
floor division操作符。在您可能需要添加一些空白以提高可读性,
else
是可选的,因为如果if
测试为真,您已经退出了函数。我最后,您可以给
^{4}$cnt
一个默认值,无需嵌套函数:一个变体,python3闭包
对于python2闭包,传递列表
^{pr2}$相关问题 更多 >
编程相关推荐