【问题标题】:Value check for inputted data and assigning it to a variable gives error if first inputted data gives ValueError [duplicate]如果第一个输入数据给出 ValueError,则对输入数据进行值检查并将其分配给变量会给出错误 [重复]
【发布时间】:2019-11-23 12:57:13
【问题描述】:

假设我想创建一个要求用户输入浮点数据的函数。程序检查输入是否为浮点数,如果不是,则返回开头,如果是则返回数据,使函数结束。它可以很好地检查数据类型,如果数据是浮点数,它会正常工作,但是如果我先输入无效数据然后输入有效数据,则会出现错误。

def function1():
    try:
        data1 = float(input("Please type in pi with its first 2 digits"))
        status = 1
    except ValueError:
        status = 0
    if status == 0:
        print("Please enter a valid answer.")
        function1()
    else:
        return data1
x = float(function1())
if x == 3.14:
    print("Correct!")
else:
    print("Incorrect, please try again.")
    function1()

它给我的错误是:

TypeError: float() 参数必须是字符串或数字,而不是 '无类型'

再次注意。这只发生在我第一次输入无效数据(例如“no”)然后输入有效数据(3.14、2.71 等)时。否则,“程序”工作正常。

【问题讨论】:

  • 请注意,虽然副本可以解决特定问题,但首先递归确实不是正确的方法。

标签: python if-statement input


【解决方案1】:

你没有从递归函数返回,所以你得到None

    if status == 0:
        print("Please enter a valid answer.")
        return function1()

【讨论】:

    【解决方案2】:

    你应该返回 function1 喜欢:

    def function1():
        try:
            data1 = float(input("Please type in pi with its first 2 digits"))
            status = 1
        except ValueError:
            status = 0
        if status == 0:
            print("Please enter a valid answer.")
            return function1()
            # ^^^^ Here
        else:
            return data1
    

    这也使函数递归。当你没有从函数中return 任何东西时,None 会自动返回。


    你也捕捉到了异常,所以你应该从那里进行递归:

    def function1():
        try:
            data1 = float(input("Please type in pi with its first 2 digits"))
        except ValueError:
            print("Please enter a valid answer.")
            return function1()
            # ^^^^ Here
        else:
            return data1
    

    这也删除了多余的status 以跟踪有效性。


    顺便说一句,Python 没有尾调用优化,因此您可以在使用递归时达到最大堆栈大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 2021-01-23
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2016-06-14
      相关资源
      最近更新 更多