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' |
我已经尝试过并且弄乱了返回函数,但是如果它不存在,我认为问题可能出在我的
我的代码到目前为止
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函数返回
在原始代码中,在
我已经清理了你的代码,同时试图保持它的精神:
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) |
特别是,遮蔽内置函数是不明智的(使用
您将获得None,因为在if语句中再次调用
另一种方法是循环,而不是调用相同的函数
1 2 3 4 5 | def read_input(prompt): positive = False while not positive: value, positive = validate_positive_patients(input(prompt)) return value |
我建议你使用while循环,以便它不断检查结果
请注意,您还在第一个函数中执行
另外检查输入是否为正整数