18

我正在尝试使用基于用户输入的 if-test 重新启动程序。

这段代码不起作用,但它大约是我所追求的:

answer = str(raw_input('Run again? (y/n): '))

if answer == 'n':
   print 'Goodbye'
   break
elif answer == 'y':
   #restart_program???
else:
   print 'Invalid input.'

我想做的是:

  • 如果您回答 y - 程序从顶部重新启动
  • 如果您回答 n - 程序结束(该部分有效)
  • 如果您输入其他任何内容,它应该打印'无效输入。请输入 y 或 n...' 或其他内容,然后再次询问您是否有新的输入。

我非常接近带有“while true”循环的解决方案,但是无论您按什么(n 除外),程序要么只是重新启动,要么无论您按什么(y 除外)它都会退出。有任何想法吗?

4

6 回答 6

30

此行将无条件地从头开始重新启动正在运行的程序:

os.execl(sys.executable, sys.executable, *sys.argv)

与迄今为止的其余建议相比,它的优势之一是程序本身将被再次读取。

例如,如果您在另一个窗口中修改其代码,这将很有用。

于 2015-05-14T20:57:02.660 回答
15

试试这个:

while True:
    # main program
    while True:
        answer = str(input('Run again? (y/n): '))
        if answer in ('y', 'n'):
            break
        print("invalid input.")
    if answer == 'y':
        continue
    else:
        print("Goodbye")
        break

内部 while 循环循环直到输入为'y'or 'n'。如果输入为'y',则 while 循环再次开始(continue关键字跳过剩余代码并直接进入下一次迭代)。如果输入为'n',则程序结束。

于 2013-02-16T04:54:05.977 回答
3

使用一个while循环:

In [1]: start = 1
   ...: 
   ...: while True:
   ...:     if start != 1:        
   ...:         do_run = raw_input('Restart?  y/n:')
   ...:         if do_run == 'y':
   ...:             pass
   ...:         elif do_run == 'n':
   ...:             break
   ...:         else: 
   ...:             print 'Invalid input'
   ...:             continue
   ...: 
   ...:     print 'Doing stuff!!!'
   ...: 
   ...:     if start == 1:
   ...:         start = 0
   ...:         
Doing stuff!!!

Restart?  y/n:y
Doing stuff!!!

Restart?  y/n:f
Invalid input

Restart?  y/n:n

In [2]:
于 2013-02-16T05:11:49.273 回答
3

你可以简单地用一个函数来做到这一点。例如:

def script():
    # program code here...
    restart = raw_input("Would you like to restart this program?")
    if restart == "yes" or restart == "y":
        script()
    if restart == "n" or restart == "no":
        print "Script terminating. Goodbye."
script()

当然你可以在这里改变很多东西。说什么,脚本将接受什么作为有效输入,变量和函数名称。您可以简单地将整个程序嵌套在用户定义的函数中(当然,您必须将所有内容都放在一个额外的缩进中)并使用这行代码随时重新启动它myfunctionname():更多关于这里。

于 2015-06-10T15:34:13.180 回答
1

这是一个使用装饰器的有趣方法:

def restartable(func):
    def wrapper(*args,**kwargs):
        answer = 'y'
        while answer == 'y':
            func(*args,**kwargs)
            while True:
                answer = raw_input('Restart?  y/n:')
                if answer in ('y','n'):
                    break
                else:
                    print "invalid answer"
    return wrapper

@restartable
def main():
    print "foo"

main()

最终,我认为您需要 2 个 while 循环。您需要一个循环将提示答案的部分括起来,以便在用户输入错误时可以再次提示。您需要一秒钟来检查当前答案是否为'y',并继续运行代码,直到答案不是'y'

于 2013-02-16T04:54:41.110 回答
0

很容易做到这一点

while True:

       #do something

       again = input("Run again? ")

       if 'yes' in again:
              continue
       else:
              print("Good Bye")
              break

基本上,在这种情况下,while 循环将一次又一次地运行程序,因为如果条件成立,while 循环就会运行,True所以我们使条件为真,并且如您所知True,它始终为真,从不为假。所以,不会停止,然后在此之后主要部分首先来到这里我们将从用户那里获取他们是否要继续程序然后我们会说如果用户说是我想继续然后continue关键字将带来循环再次回到顶部,也将再次运行程序,如果用户说别的,或者如果你只想在用户说不的情况下退出程序,你可以用另一种方式来做,那么只需添加这个

elif 'no' in again:
       print("Good Bye")
       break
else:
       print("Invalid Input")

这看起来如果输入中有“否”字,如果有,那么它将打破循环并且程序将退出

于 2021-04-15T06:22:27.483 回答