我有一个学生给我以下代码:
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()
在第一次迭代之后,如果用户输入“是”以外的任何内容,则while循环的主体将不会按预期执行。但是,如果我们输入“是”,它将执行(再次按预期执行)并提示“输入任何数字”,但是在第二次迭代中,即使用户在“您是否希望再次输入”上输入了除“是”之外的任何内容。 ,while循环的主体仍执行。现在,我在其上运行调试器,并发现执行第5行时inp
just的值更改为'yes'
。在执行该行之前inp
,根据调试器,的值仍然是用户输入的值。为什么呢?
现在我在这里查找了它,但是找不到任何解释,尽管我找到了一种解决方法,可以通过addtwo()
在while循环的主体中的to调用之前添加一个return来解决(我在这里找到:递归地调用一个函数)用户输入),但不明白为什么inp
只是在本地堆栈中更改的值以及该return
语句如何解决?
这是工作代码:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo()
而且,令我感到困惑的是,如果我们使用if
语句代替,那么代码就可以正常工作while
。
调用递归函数的工作方式有点像您已在其中复制并粘贴了内部函数。复制/粘贴与真实递归之间存在一些差异:
尽管存在这些差异,但是如果您想理解递归调用,则复制和粘贴是考虑它的好方法。让我们尝试一下您的功能。以下代码与您编写的内容等效,只要您键入的次数不是太多,就可以:
def addtwo0():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo1()
def addtwo1():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo2()
def addtwo2():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
raise Exception("tried to recurse too deeply!")
如果将这些内联函数放在一个函数中,也许会更加清楚。我们必须重命名变量,以免它们彼此覆盖。
def addtwo():
numb0=input("enter any number")
add0=int(numb0)+2
print(add0)
inp0 = input("do you wish to enter again")
while inp0=="yes":
numb1=input("enter any number")
add1=int(numb1)+2
print(add1)
inp1 = input("do you wish to enter again")
while inp1=="yes":
numb2=input("enter any number")
add2=int(numb2)+2
print(add2)
inp2 = input("do you wish to enter again")
while inp2=="yes":
raise Exception("tried to recurse too deeply!")
现在,您可以看到问题的直接原因:未设置inp2
为“是”inp1
或设置为“是” imp0
。或在原始代码中,inp
在对的嵌套调用中设置为“是”addtwo
不会将外部设置为“是” imp
,因为每个函数都有其自己的变量集。
现在,您还可以看到问题的根本原因:您不需要多个循环即可执行此操作。递归(带有if
)或while
循环足以启用条件的重复检查。通过同时拥有这两者,即使您解决了紧迫的问题,也使事情变得不必要地复杂。在这种情况下,while
循环实际上是最简单的。将input
语句放在其中,并完全摆脱递归调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句