Python TypeError:int()参数必须是字符串,类字节对象或数字,而不是'NoneType'

时间:2017-11-12 20:37:38

标签: python validation typeerror

我是学生,对python来说很新。我正在尝试验证用户输入以检查他们是否输入了3位数字,他们应该只能输入2位数字。当用户只输入2位数时,程序运行正常但是当它们输入3或更多时,它会抛出我创建的错误消息并要求他们重新输入一个只有2位数的数字,然后一旦他们重新输入2位数number python给了我TypeError。我得到的完整错误是:

Traceback (most recent call last):
  File "/Users/admin/Desktop/week6/question_7.py", line 87, in <module>

  File "/Users/admin/Desktop/week6/question_7.py", line 79, in do_stuff
    print (display_grade(user_in))
TypeError: int() argument must be a string, a bytes-like object or a 
number, not 'NoneType'

我无法弄清楚它为什么会这样做。我觉得它与调用本身的get_input()函数有关吗?我无法弄清楚如何避免这种情况。

我搜索了我一直得到的错误,找不到任何有用的错误。

这是程序,非常简单。

 NUMBER_OF_TESTS = 5

def get_input ():
    print ('enter a test score below')
    user_in = input()
    if len(user_in) > 2:
        print ('error, you can only enter a 2 digit number.')
        get_input()
    else:
        return user_in

def display_grade (letter_grade):
    if letter_grade >= 89:
        return ('You got an A!')
    elif letter_grade >= 80 and letter_grade <= 89:
        return ('You got a B!')
    elif letter_grade >= 70 and letter_grade <= 79:
        return ('You got a C')
    elif letter_grade >= 61 and letter_grade <= 69:
        return ('You got a D')
    else:
        return ('You got an F')

def calAverage(total):
    average_score = (total) / NUMBER_OF_TESTS
    return int(average_score)

def do_stuff():
    i = 0

    x = 0

    while i < NUMBER_OF_TESTS:
        user_in = int(get_input())
        print (display_grade(user_in))
        x = x + user_in
        i = i + 1
    print ('your average score is' , calAverage(x) , 'which means' , display_grade(calAverage(x)))



do_stuff()

1 个答案:

答案 0 :(得分:1)

def get_input ():
    print ('enter a test score below')
    user_in = input()
    if len(user_in) > 2:
        print ('error, you can only enter a 2 digit number.')
        get_input()
    else:
        return user_in

问题是递归get_input()调用。当您拨打该电话时,您不会返回您获得的值,因此会返回None。将其替换为return get_input()。此外,您的功能不允许人们在测试中获得100分。我不知道这是否是故意的。