Python 我实现这个sentinel值有什么问题?
问题是:此程序读取浮点值序列并计算其平均值。零的值用作哨兵。改进循环,使循环仅在用户输入字母Q时退出 这是我的代码:Python 我实现这个sentinel值有什么问题?,python,Python,问题是:此程序读取浮点值序列并计算其平均值。零的值用作哨兵。改进循环,使循环仅在用户输入字母Q时退出 这是我的代码: total = 0.0 count = 0 # TODO: Fix this program so that it only stops reading numbers # when the user enters Q. value = float(input("Enter a real value or Q to quit: ")) while valu
total = 0.0
count = 0
# TODO: Fix this program so that it only stops reading numbers
# when the user enters Q.
value = float(input("Enter a real value or Q to quit: "))
while value != "Q" :
total = total + value
count = count + 1
value = float(input("Enter a real value or Q to quit: "))
avg = total / count
print(avg)
这是我的错误消息:
文件“/tmp/codecheck.zUZpqo8apX/computesum.py”,第11行,在
值=浮点(输入(“输入一个实际值或Q以退出:”)
ValueError:无法将字符串转换为float:'Q'关于您的代码:
value=float(输入(“输入一个实际值或Q以退出:”)
如果要处理像Q
这样的非浮点值,那么此时应将其视为字符串,而不是立即尝试将其转换为float
(如您所发现的那样,Q
将失败)
换句话说,类似于:
value=input(“输入实际值或Q以退出:”)
而价值!=“Q”:
总计=总计+浮动(值)
计数=计数+1
值=输入(“输入实际值或Q以退出:”)
如果您输入的值既不是
Q
,也不是有效的float
,则仍然会导致问题,但您可以通过捕获异常并调整行为来处理此问题:
value=input(“输入实际值或Q以退出:”)
而价值!=“Q”:
尝试:
总计=总计+浮动(值)
计数=计数+1
除值错误外:
打印(“不是有效的浮点值,请重试。”)
值=输入(“输入实际值或Q以退出:”)
如果在这种情况下float()
调用失败,则total
和count
都不会更新,并且将执行except
块,让用户知道有问题
我要提到的另一件事是,您应该考虑这样一种情况,您首先要做的是输入
Q
。在这种情况下,count
仍将设置为零,因此您可能不想除以它。相反,您可以执行以下操作:
如果计数==0:
打印(“没有输入值,因此没有平均值”)
其他:
平均值=总数/计数
打印(平均值)
为什么不在测试输入是否等于'Q'
后将其转换为浮点?你的float()
太快了。我不明白……谢谢。除此之外,我们还没有了解到,但第一个答案是有效的。谢谢你的帮助。这本书教给我的最重要的事情之一就是如何寻求帮助。当你看到人们改进了你大学课本上的代码,你开始意识到即使是大学教授也会犯错误时,这简直是疯了。@hunt67241你在说教授犯了什么错误?@Kelly Bundy教授写了那本书,并为这个问题写了大部分代码。我唯一更改的是while值!=0到while值!=paxdiablo指出,如果输入的字符串值不是“Q”,代码仍然会崩溃。因此,本质上,代码并不完美。这仍然是一种错误,我觉得我从paxdiablo那里学到了更多关于这个问题的知识,而不是为每个人编写Pyhon的教授们。我想我应该将这句话改为“我想代码总是可以改进的,不管你有多少经验。”@hunt67241问题是,在你做出更改之前,代码一直工作正常(因为0是有效的float
)。所以本质上,你引入了bug。这是一个很好的观点。。。我没有想到这一点。这段代码本来就是有缺陷的,所以如果他们在第一段代码中添加了异常。