【问题标题】:How do I make this program loop indefinitely?如何让这个程序无限循环?
【发布时间】:2018-01-15 17:30:37
【问题描述】:

我想从头到尾无限期地循环这段代码(直到用户杀死它),所以我不必继续重新运行它。有没有办法让这成为可能?非常感谢您的帮助。在用户输入“完成”(并打印所有详细信息)后,程序应自行重启。

print ("Input done when finished")
print ("Input thresholds")

maximumnum = int(input("Input maximum number: "))
minimumnum = int(input("Input minimum number: "))


minimum = None
maximum = None

while True:
    inp =input("Enter a number: ")
    if inp == "done": 
        break

    try:
        num = float(inp)
    except:
        print ("Invalid input")
        continue  

    ## ---- Additional Check ---- ##
    if num > maximumnum:
        print('Number greater the maximum allowed range')
        break

    if num < minimumnum:
    print('Number smaller the maximum allowed range')
    break        
    ## -------------------------- ##                  

    if minimum is None or num < minimum:
        minimum = num

    if maximum is None or num > maximum:
        maximum = num

print ("Maximum:", maximum)
print ("Minimum:", minimum)
print ("Try again")

【问题讨论】:

  • 您已经无限循环播放它了吗?似乎是什么问题?
  • 在整个程序周围加上另一个while playing,并使用变量来定义何时结束。 @MikeTung:一旦程序中断(由于 num > maximumnum 左右),最后一行被打印并结束。

标签: python python-3.x loops infinite-loop


【解决方案1】:

为什么不将整个脚本包装在另一个 while True 中?要停止,用户必须终止正在运行的进程。

while True:
    print ("Input done when finished")
    print ("Input thresholds")

    maximumnum = int(input("Input maximum number: "))
    minimumnum = int(input("Input minimum number: "))


    minimum = None
    maximum = None

    while True:
        inp =input("Enter a number: ")
        if inp == "done": 
            break

        try:
            num = float(inp)
        except:
            print ("Invalid input")
            continue  

        ## ---- Additional Check ---- ##
        if num > maximumnum:
            print('Number greater the maximum allowed range')
            break

        if num < minimumnum:
        print('Number smaller the maximum allowed range')
        break        
        ## -------------------------- ##                  

        if minimum is None or num < minimum:
            minimum = num

        if maximum is None or num > maximum:
            maximum = num

    print ("Maximum:", maximum)
    print ("Minimum:", minimum)
    print ("Try again")

【讨论】:

  • break 只跳出内部 while True 循环,不跳出外部循环。
  • @Martin 正是这样,然后执行打印语句并再次运行脚本。毕竟这是预期的行为
  • 这解决了循环问题但破坏程序目的的问题。程序会在一次输入后自行重启,但它应该在用户输入“完成”后重启(并打印所有详细信息。)
【解决方案2】:

我会将它包装在方法上并在无限循环中运行它。请尝试以下操作:

def process_input(maximumnum, minimumnum):
    minimum = None
    maximum = None

    while True:
        inp =input("Enter a number: ")
        if inp == "done":
            break

        try:
            num = float(inp)
        except:
            print("Invalid input")
            continue

            ## ---- Additional Check ---- ##
        if num > maximumnum:
            print('Number greater the maximum allowed range')
            break

        if num < minimumnum:
            print('Number smaller the maximum allowed range')
        break
        ## -------------------------- ##                  

        if minimum is None or num < minimum:
            minimum = num

        if maximum is None or num > maximum:
            maximum = num

    return minimum, maximum


def main():
    print("Input done when finished")
    print("Input thresholds")

    maximumnum = int(input("Input maximum number: "))
    minimumnum = int(input("Input minimum number: "))

    minimum, maximum = process_input(maximumnum, minimumnum)

    print("Maximum:", maximum)
    print("Minimum:", minimum)
    print("Try again")


if __name__ == '__main__':
    while True:
        main()

希望这会有所帮助。

【讨论】:

  • 这解决了循环问题但破坏程序目的的问题。程序会在一次输入后自行重启,但它应该在用户输入“完成”后重启(并打印所有详细信息。)
  • Hi Cherie - 以上与您的原始代码相同,唯一的区别是我使用方法组织它,只是在代码中添加了无限循环。如果我可能会问(并且可能),您是否介意分享您对此代码的要求。这样可以更轻松地帮助您编写代码。
【解决方案3】:

我经常使用这样的范例来完成“循环直到我这么说” 之类的。

class UserKilledException(KeyboardInterrupt):
     pass

try:
    while True:
        #do stuff
except UserKilledException:
    #do cleanup here

只要用户决定以某种方式关闭应用程序,只需让您的代码抛出UserKilledException。如果它是一个 cli 应用程序,那么 KeyboardInterrupt 就可以了。

【讨论】:

  • 嗨 Scott - 这是一种有趣的方法,但是,我认为如果用户尝试终止程序(如问题所要求的那样),那么您的代码将捕获异常,但处理不允许的异常用户使用键盘中断(如 ctrl + c)终止执行。我相信问题更简单,他们只想在无限循环中运行代码,包括询问问题部分。
  • 根据 Ali 的说法,如果您摆脱 pass 声明并添加评论说“# do cleanup here”,我会对此表示赞成。然后它变成了一种优雅的方法,因为它允许用户打断但给应用程序一个做一些家务的机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多