如果首先输入的数据给出ValueError,则对输入数据的值检查并将其分配给变量会产生错误

时间:2019-07-14 16:41:47

标签: python if-statement input

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

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()参数必须是字符串或数字,而不是   “ NoneType”

再次注意。仅当我第一次输入无效数据(例如“否”)然后输入有效数据(3.14、2.71等)时,才会发生这种情况。否则,“程序”可以正常工作。

2 个答案:

答案 0 :(得分:1)

您应该返回 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没有尾部调用优化功能,因此使用递归时可以达到最大堆栈大小。

答案 1 :(得分:0)

您没有从递归函数返回,因此您得到了None

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