python - Python - 脚本计数错误,但为什么呢?
问题描述
我刚刚开始学习Python。作为练习,我写了这个小脚本:
编写一个重复读取数字的程序,直到用户输入“完成”。输入“完成”后,打印出总数、计数和平均值。如果用户输入的不是数字,请使用try
and检测他们的错误except
并打印错误消息并跳到下一个数字。
它通常会做它应该做的事情,但是:当我玩它一点时,我注意到一个奇怪的行为:因为它在提示后需要几个(int)数字,所以它不会 - 也不应该 - 带字符。到目前为止一切顺利,但后来我尝试了一个浮点数作为输入。该脚本不会将其视为有效输入,但会对其进行计数并将截断的数字放入总数中。
代码:
total = float(0) # sum of items
count = int(0) # number of items
avrg = float(0) # average of items
input_in = True
while input_in:
try:
line = input('Enter a number: ')
if line == 'done':
print('total:', str(total),' count:', str(count),' average:', str(avrg))
break
print(line)
for itervar in line:
total = total + float(itervar)
count = count+1
avrg = total / count
except:
print('Invalid input')
输出:
Enter a number: 1.5
1.5
Invalid input
Enter a number: 5
5
Enter a number: 5
5
Enter a number: 5
5
Enter a number: done
total: 16.0 count: 4 average: 4.0
我尝试过的 - 但没有奏效:将变量 line 和/或 itervar 分配为 float()。我尝试了包含的调试器,但我无法理解它。我不知道这如何工作。
解决方案
您的线路:
for itervar in line:
遍历输入的每个字符,这对于您的第一个输入 ( 1.5
) 会导致三个迭代:
1
.
5
因此,对于第一次迭代,您的总数增加了1
,而对于第二次迭代,您尝试将.
其用作数字,但失败了。(因此,为什么你的最终值,在添加 后5 + 5 + 5
,是16
)
您应该考虑将整个输入字符串转换为数字,而不是使用 for 循环来迭代您的输入。
作为额外的奖励......
考虑您是否真的需要重新计算每个循环的平均值。由于您有total
和,因此我建议您根据这两个数字count
计算您的平均值on-demand 。
推荐阅读
- virtual-machine - 错误:无法将套接字连接到“/var/run/libvirt/libvirt-sock”:连接被拒绝
- prolog - Prolog - 即使 asserta/1 尚未执行,动态谓词也会返回 true
- python - 如果Python中的输入为负数,如何结束循环?
- python - Graphviz 太慢了
- python - 如何从此 python 请求响应中获取某个项目
- reactjs - 如何在安全端口上运行 reactjs?
- html - Bootstrap 4导航栏无法向右移动项目
- python - Keras 中的自定义损失函数,以掩码数组作为输入
- r - 使用每隔一行的跳过功能逐行读取 txt 文件,并使用 R 将输出保存为数据帧
- json - Swift cli 应用简单 http 获取 JSON