测试python代码时出错:TypeError:int()参数必须是字符串,类字节对象或数字,而不是’NoneType’

Error testing python code: TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

Python的新手,我正在尝试回答以下问题:医院记录他们正在处理的患者数量,为每位患者提供所需的营养,然后在总计总和之后平均每位患者所需的营养。

现在,当我测试/验证数据输入时,我看到我的代码导致错误,因为我试图解决问题的方式很笨拙。测试时,我得到了这个:

1
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

我已经尝试过并且弄乱了返回函数,但是如果它不存在,我认为问题可能出在我的read_input()函数上。我一直在搞乱PythonTutor,所以我可以想象出错误在哪里......我只是不知道如何摆脱这个循环并修复它。

我的代码到目前为止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def validate_positive_patients(n):

    try:
        n = float(n)
        if n <= 0:
            print("Please enter a nonnegative number")
            return n, False

    except ValueError:
        print("Please enter a positive integer")
        return None, False
    return n, True

def read_input(float):
    value, positive = validate_positive_patients(input(float))
    if not positive:
        read_input(float=float)
    else:
        return value

# rest of code seems to work fine

我的代码很笨拙,但我真正喜欢它只接受'患者数'的int值,蛋白质的浮标,碳水化合物等,如果最初有一个输入错误,不只是吐出一个无值。

如果只有计算机知道你想要他们做什么,而不是我告诉它做什么:P
在此先感谢您的帮助!


默认情况下,Python函数返回None

在原始代码中,在read_input中,如果输入的值不是正数,那么您从未点击return语句,因此返回None

我已经清理了你的代码,同时试图保持它的精神:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def get_positive_int(message):
    while True:
        input_value = input(message)
        if input_value.isdigit() and int(input_value) > 0:
            return int(input_value)

        else:
            print('Please enter a positive number.')

def get_positive_float(message):
    while True:
        input_value = input(message)
        try:
            float_value = float(input_value)
            if float_value > 0:
                return float_value

        except ValueError:
            pass

        print('Please enter a positive real number.')

def calculate_average(nutrition, total_quantity, total_patients):
    average = total_quantity / total_patients
    print(f'{nutrition} {average}')

number_of_patients = get_positive_int("Enter number of patients:")

protein, carbohydrates, fat, kilojoules = 0, 0, 0, 0

for i in range(int(number_of_patients)):
    print(f'Patient {i + 1}')
    protein += get_float("Amount of protein (g) required:")
    carbohydrates += get_float("Amount of carbohydrates (g) required:")
    fat += get_float("Amount of fat (g) required:")
    kilojoules += 4.18*(4*protein + 4*carbohydrates + 9.30*fat)

print("Averages:")
calculate_average(nutrition ="Protein (g):", total_quantity = protein,
                  total_patients = number_of_patients)
calculate_average(nutrition ="Carbohydrates (g):", total_quantity =
                  carbohydrates, total_patients = number_of_patients)
calculate_average(nutrition ="Fat (g):", total_quantity = fat,
                  total_patients = number_of_patients)
calculate_average(nutrition ="Kilojoules (kJ):", total_quantity =
                  kilojoules, total_patients = number_of_patients)

特别是,遮蔽内置函数是不明智的(使用float作为参数名称),而f-strings可以使代码更容易阅读。


您将获得None,因为在if语句中再次调用read_input时忽略了一个值。

另一种方法是循环,而不是调用相同的函数

1
2
3
4
5
def read_input(prompt):
    positive = False
    while not positive:
        value, positive = validate_positive_patients(input(prompt))
    return value

我建议你使用while循环,以便它不断检查结果

请注意,您还在第一个函数中执行return None, False,因此在实际返回数值之前仍应检查value is not None

另外检查输入是否为正整数