【问题标题】:Python Functions looping into a infinite loopPython函数循环进入无限循环
【发布时间】:2017-10-04 04:50:10
【问题描述】:

我正在尝试使用此程序处理来自函数外部的数字,但是当我运行该函数时,它将进入无限循环并且不会停止打印。

当我在打印命令后取出 inputNumber() 时它可以工作,但我需要在那里?

这是我的完整代码:

def inputNumber():
    try:
        print (userInput)
        Number2 = ('%02d' % (int(userInput)))
        print(Number2)
    except ValueError:
        print("Not an integer! Try again.")
        inputNumber()

    else:
        if int(Number2)<=10:
        #print("Correct")
        if len(str(Number2))==2:
            print("Number Is Good Continue")
        else:
            print("Try Again")
            inputNumber()
        else:
        print("Score Must Be Within 01-10")

userInput = input("Input Score")
inputNumber()

不起作用的一点是,当我输入除整数以外的任何内容时,它应该说 “不是整数!再试一次。” 但它会循环。我怎么能解决这个问题,因为我看不出它会循环的任何原因。

我尝试过使用 break,但我认为它在 while 循环中不起作用?

【问题讨论】:

  • inputNumber方法本身应该负责调用input
  • 嗨,你能解释一下吗?
  • 当用户输入错误时,您的代码应该让他们再试一次。但事实并非如此。查看Asking the user for input until they give a valid response 以获取有关重组代码的一些想法。
  • 他的意思是每次调用inputNumber()函数时,它也应该调用userInput。在 inputNumber() 中定义userInput
  • 谢谢,伙计们,我想我得在里面运行它,因为它的工作原理只是有点需要它出来,但是干杯!

标签: python python-3.6


【解决方案1】:

不要使用递归来替换循环; Python 不进行尾调用优化。只需循环,直到输入可以转换为 1 到 10 之间的数字,此时您可以显式跳出循环。

def input_number():
    while True:
        n = input("Input score: ")
        try:
            n = int(n)
        except ValueError:
            print("Not an integer! Try again.")
            continue

        if 1 <= n <= 10:
            print("Correct")
            break

        print("Score must be between 1 and 10")

    return '%02d' % (n,)

value = input_number()

【讨论】:

    【解决方案2】:

    编辑了您的代码:请参阅以下内容

    def inputNumber():
        userInput = input("Input Score: ")
        try:
            print (userInput)
            Number2 = ('%02d' % (int(userInput)))
            print(Number2)
        except ValueError:
            print("Not an integer! Try again.")
            inputNumber()
    
        else:
            if int(Number2)<=10:
                #print("Correct")
                if len(str(Number2))==2:
                    print("Number Is Good Continue")
                else:
                    print("Try Again")
                    inputNumber()
            else:
                print("Score Must Be Within 01-10")
    
    inputNumber()
    

    【讨论】:

    • 我以前也遇到过这样的情况,只是需要在外面输入数字,但我认为它不会起作用,干杯
    【解决方案3】:

    解决此问题的一种方法是绘制流程的流程图,以了解为什么会发生循环,而您并不打算这样做。

    有点简化,你有 inputNumber()-->inputNumber()

    在您的 inputNumber() 函数中,函数本身可能会被调用两次:

    第 8 行

    第 17 行

    然后发生的是函数本身将重新启动。此外,一旦内部函数解析完毕,解释器就会返回到函数调用结束的地方并继续到程序的结尾。

    在下面查看我的 cmets:

    def inputNumber(): # Define what happens when you call inputNumber()
        try:
            print (userInput)
            Number2 = ('%02d' % (int(userInput)))
            print(Number2)
        except ValueError:
            print("Not an integer! Try again.")
            inputNumber() # Call inputNumber()
    
        else:
            if int(Number2)<=10:
            #print("Correct")
            if len(str(Number2))==2:
                print("Number Is Good Continue")
            else:
                print("Try Again")
                inputNumber() # Call inputNumber()
            else:
            print("Score Must Be Within 01-10")
    
    userInput = input("Input Score")
    inputNumber() # Call inputNumber
    

    这称为递归,在某些内存限制下的特定上下文中可能是一个有用的应用程序,但它通常是一个应该在更高级的级别引入的概念 - 除非非常具体的问题需要递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多