【问题标题】:Function returns None after wrong input输入错误后函数返回None
【发布时间】:2017-01-04 10:28:41
【问题描述】:

我需要一个排除错误输入并要求再次输入的功能。但在输入错误后,它返回None 而不是新输入。我的代码有什么问题,我该如何解决?

def start():

    def inputNumber(answer):
        try:
            number = int(input(answer))
            if number <= 100 and number >= 0:
                print('%%%',number,'%%%')
                return number
            else:
                inputNumber('Number is wrong, please input number from 0 to 100: ')
        except (ValueError):
            inputNumber('It is not a number, please input number from 0 to 100: ')
    
    def checkInput(number2):
        print('$$$',number2,'$$$')
        if number < 50:
            return number2
        else:
            return checkInput(inputNumber('Input number from 0 to 100: '))

    number = 0
    print('###',checkInput(inputNumber('Input number from 0 to 100: ')),'###')
    start()

start()

这是结果:

输入0到100的数字:777

数字错误,请输入0到100之间的数字:sadf

不是数字,请输入0到100之间的数字:17

%%% 17 %%%

$$$ 无 $$$

TypeError:不可排序的类型:NoneType()

【问题讨论】:

  • Sorry function checkInput() 出错了,不过没关系,反正返回 None。
  • 在 Python 中 return 是明确的。您必须返回函数的结果。在elseexcept 中的inputNumber 之前添加return

标签: python python-3.x


【解决方案1】:

您正在递归调用inputNumber,但不返回递归调用的结果。更好地使用循环而不是递归:

def inputNumber(prompt):
    while True:
        try:
            number = int(input(prompt))
            if 0 <= number <= 100:
                print('%%%',number,'%%%')
                return number
            prompt = 'Number is wrong, please input number from 0 to 100: '
        except ValueError:
            prompt = 'It is not a number, please input number from 0 to 100: '

顺便说一句:您还应该在其他函数中使用循环,并且不要定义嵌套函数。

【讨论】:

    【解决方案2】:

    运行此代码将解决您的问题。您只需要捕获额外的错误 (NameError)

    def start():
    
        def inputNumber(answer):
            try:
                number = int(input(answer))
                if number <= 100 and number >= 0:
                    print('%%%',number,'%%%')
                    return number
                else:
                    inputNumber('Number is wrong, please input number from 0 to 100: ')
            except (ValueError, NameError) as e:
                inputNumber('It is not a number, please input number from 0 to 100: ')
    
        def checkInput(number2):
            print('$$$',number2,'$$$')
            if number < 50:
                return number2
            else:
                return checkInput(inputNumber('Input number from 0 to 100: '))
    
        number = 0
        print('###',checkInput(inputNumber('Input number from 0 to 100: ')),'###')
        start()
    
    start()
    

    【讨论】:

      【解决方案3】:

      问题是,一旦检查失败,您会再次调用inputNumber,但不要对答案做任何事情。您需要退货。

      def start():
      
          def inputNumber(answer):
              try:
                  number = int(input(answer))
                  if number <= 100 and number >= 0:
                      print('%%%', number, '%%%')
                      return number
                  else:
                      return inputNumber('Number is wrong, please input number from 0 to 100: ')
              except (ValueError):
                  return inputNumber('It is not a number, please input number from 0 to 100: ')
      
          def checkInput(number2):
              print('$$$', number2, '$$$')
              if number < 50:
                  return number2
              else:
                  return checkInput(inputNumber('Input number from 0 to 100: '))
      
          number = 0
          print('###', checkInput(inputNumber('Input number from 0 to 100: ')), '###')
          start()
      
      start()
      

      【讨论】:

        猜你喜欢
        • 2014-12-06
        • 2022-11-21
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多