python不能正确退出程序
在我的程序中,我想和用户互动,让他按特定的字母来做一些事情(我认为这个游戏的逻辑与我的问题无关)。当我开始游戏时,作为第一个字母,我立即按“q”退出程序,但当我玩了一段时间(使用几次“g”和“r”)后,我也必须按几次“q”才能退出程序(每次我都会收到与游戏开始时相同的提示“输入g开始…”) 我使用的是Canopy和Python 2.7python不能正确退出程序,python,recursion,Python,Recursion,在我的程序中,我想和用户互动,让他按特定的字母来做一些事情(我认为这个游戏的逻辑与我的问题无关)。当我开始游戏时,作为第一个字母,我立即按“q”退出程序,但当我玩了一段时间(使用几次“g”和“r”)后,我也必须按几次“q”才能退出程序(每次我都会收到与游戏开始时相同的提示“输入g开始…”) 我使用的是Canopy和Python 2.7 t_h = '' def pg(wl): global t_h result = raw_input("Enter g to start ne
t_h = ''
def pg(wl):
global t_h
result = raw_input("Enter g to start new game, r to replay last game, or q to end game: ")
possible_choices = ["g", "r", "q"]
if result in possible_choices:
if result == 'g':
t_h = dh(n)
ph(t_h, wl, n)
if result == 'r':
if t_h == '':
print 'You have not played a game yet. Please play a new game first!'
else:
ph(t_h, wl, n)
if result == 'q':
return None
else:
print "Invalid letter."
return pg(wl)
如果看不到更多的代码(特别是为
dh
和ph
编写的代码),就很难判断,但我猜pg
是从这些函数中的一个或代码中的其他函数调用的。函数pg
在任何非可能选择的情况下递归调用自己(因为只有q
直接返回)——也就是说,在返回pg(wl)
行上
您描述的情况意味着ph
和dh
中的一个或两个正在再次调用pg
。
这意味着,对于每个非q
输入,您将在堆栈上从ph
(或ph
和dh
)提示一个新问题一个来自对pg
的递归调用。这将导致您描述的确切行为,其中一个q
不足以退出。对于您发布的代码,即没有dh
和ph
,不可能精确地知道,但这是合乎逻辑的结论
如果希望立即退出,则必须在q
情况下使用带有break
的简单无限循环,而不是递归。
另一种可能是@PauloScardine使用exit()
的想法,如果您真正想退出整个过程。同样,对于您发布的代码片段,不可能知道这是否可行(pg
直接从main
函数调用).您正在递归调用函数。每个递归都需要一个q
才能退出。用循环替换递归。ctrl+c始终有效:使用exit()替换return None
)
。这是不准确的:无论ph
做什么,递归已经存在,因为在所选字母的if
块的末尾,会再次调用pg
,除非按下q
。如果ph
调用pg
,则递归来自不同的源,但即使也会出现这种情况de>ph
没有。据我所知,递归调用只是作为一个转到。尝试从hoodoo的代码中删除非递归调用并运行它。当您第一次给它一个q
时,它将退出。您实际上是对的,尽管我不会将递归调用称为转到。我调整了我的答案以反映这一点。您是对的假设其他函数也调用pg。我注意到我在某些情况下将return语句放在了ph中。它单独工作很好,但导致了奇怪的行为,正如我在上面开始使用pg时所描述的。现在它在pg中没有调用也可以工作。感谢您的帮助以及本主题中涉及的ppl的其他部分。