我让一个学生给了我以下代码:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
addtwo()
在第一次迭代之后,如果用户输入了“yes”以外的任何内容,while循环的主体就不会如预期的那样执行。但是,如果我们输入'yes',它就会执行(正如预期的那样)并提示“enteranynumber”,但是在第二次迭代中,即使用户在“Doyouwillenteragain”中输入了“yes”之外的任何内容,while循环的主体仍然会执行。现在我在上面运行了调试器,发现在执行第5行时,inp
的值只会变为'yes'
。在执行行之前,根据调试器,inp
的值仍然是用户输入的值。为什么会这样?在
现在我在这里查找它,但是找不到任何解释,尽管我找到了一种方法来解决这个问题,在while循环体中的addtwo()
调用之前添加了一个return(我在这里找到了:Calling a function recursively for user input),但是我不明白为什么inp
的值在本地堆栈中发生了变化,以及return
语句是如何修复它的?在
工作代码如下:
^{pr2}$而且,让我更困惑的是,如果我们使用if
语句而不是while
,代码就可以正常工作。在
调用递归函数有点像复制并粘贴了内部函数。复制/粘贴和真正的递归之间有一些区别:
尽管存在这些差异,但是如果您正在努力理解递归调用,那么复制和粘贴是一种很好的方法。我们来试试你的功能吧。以下代码与您编写的代码相同,只要您不要键入“yes”太多次:
如果我们把这些嵌入到一个函数中,也许会更清楚。我们必须重命名变量,这样它们就不会互相覆盖了。在
^{pr2}$现在您可以看到问题的直接原因:将}设置为yes。或者在原始代码中,在对}设置为yes,因为每个函数都有自己的一组变量。在
inp2
设置为“yes”不会将inp1
或{addtwo
的嵌套调用中将inp
设置为“yes”,并没有将外部的{现在您还可以看到问题的根本原因:您不需要多个循环来执行此操作。递归(带有
if
)或while
循环都足以重复检查条件。如果两者兼而有之,即使你解决了眼前的问题,也会让事情变得不必要的复杂。在本例中,while
循环实际上是最简单的;将input
语句放在其中,然后完全去掉递归调用。在摘要
这是因为一旦输入yes一次,该函数将永远循环,而不管下一个递归调用做什么。在
您可以通过更改以下内容来修复代码:
到
^{pr2}$走查
返回语句
默认情况下,python中不返回任何值的函数实际上不返回任何值。这意味着您调用add_two,如果用户在提示时没有输入“yes”,它将返回,这将强制第一个调用也返回。在
相关问题 更多 >
编程相关推荐