我是Python新手,我试图回答一个家庭作业问题:一家医院记录他们正在治疗的患者数量,向每位患者提供的所需营养,然后在合计总数后平均每位患者所需营养。
现在,当我测试/验证数据输入时,我看到我的代码正在导致错误,因为我试图解决问题的方式很笨拙。测试时,我得到以下信息:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
我尝试过处理返回函数,但如果没有返回函数,我认为问题可能出在我的read\u input()
函数上。我一直在和PythonTutor鬼混,所以我可以想象错误在哪里。。。我只是不知道如何摆脱这个循环并修复它。
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值,蛋白质、碳水化合物等的浮点值,如果一开始出现输入错误,则不只是抛出一个None值。
如果计算机知道你想让它们做什么,而不是我告诉它做什么就好了: P提前感谢任何帮助!
如果在if语句中再次调用read\u input
,则会忽略一个值,因此不会得到任何结果。
另一种方法是循环,而不是调用相同的函数
def read_input(prompt):
positive = False
while not positive:
value, positive = validate_positive_patients(input(prompt))
return value
我建议您使用while循环,以便它不断地检查结果
请注意,您还在第一个函数中执行返回无,假的操作,因此您仍然应该在实际返回数字值之前检查值是否为无
还要检查输入是否为正整数
默认情况下,Python函数返回None
。
在原始代码中,在read\u input
中,如果输入的值不是正数,则您从未点击return
语句,并相应地返回None
。
我已经清理了你的代码,同时试图保持它的精神:
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字符串可以使代码更易于阅读。
我知道很多人问过相关的问题,但请帮我解决。我试图复制一个我在网上找到的开源温度控制实验室。我想在树莓皮上运行它。这就是我一直遇到的错误: 生成它的代码如下所示: 我相信这段代码试图通过以下代码与另一个python文件通信: 我还不知道我周围的python代码,所以一个非常清晰的“虚拟类”解决方案的解释会很有帮助。谢谢伙计们。
views.py urls.py
我想对一个浮点数进行四舍五入,得到点后的两位数。但我收到了一个错误: float()参数必须是字符串或数字,而不是“NoneType” 在评级模型的评级字段中四舍五入是一个坏主意,因为平均_评级不会四舍五入
我使用的是Python3.3,但在尝试pickle一个简单的字典时出现了一个隐秘的错误。 代码如下: 我得到:
我试图从列列表中获取最大值,以及具有最大值的列的名称,如这些帖子中所述PySpark:计算列子集的行最大值并添加到现有的数据帧 中如何获取pyspark数据帧中具有最大值的列的名称我已经查看了许多帖子并尝试了许多选项,但尚未成功。 列对象不可调用TypeError:“列”对象不可调用,请使用SusCol列并传递多列Pyspark:在UDF中传递多列 加载到数据帧Rule_Total_Score的表
我正在尝试在Yii2上设置codeception测试。我的堆栈是:vagrant Selenium chromedriver PHP7.1。这是我的构想: 配置/test.php等于配置/console.php 以下是控制台的一些输出: 最后,我把PageCest作为基本模板中的HomeCest,并运行测试。单元测试正在工作,但验收测试返回以下内容: 测试/验收/页面测试。php:EnsureTh
我已经读了很多关于这个错误的帖子,但我仍然无法理解。当我尝试循环遍历我的函数时: 以下是错误:
问题内容: 我试图子类化threading.Condition今天早些时候,但没有奏效。当我尝试对threading.Condition类进行子类化时,这是Python解释器的输出: 有人可以解释这个错误吗?谢谢! 问题答案: 之所以得到该异常,是因为尽管它具有类名,但它是一个函数,并且不能对函数进行子类化。 在Python Bugtracker上 已经引发了这个不是很有帮助的错误消息,但已将其标