首页 > 解决方案 > Python - 脚本计数错误,但为什么呢?

问题描述

我刚刚开始学习Python。作为练习,我写了这个小脚本:

编写一个重复读取数字的程序,直到用户输入“完成”。输入“完成”后,打印出总数、计数和平均值。如果用户输入的不是数字,请使用tryand检测他们的错误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()。我尝试了包含的调试器,但我无法理解它。我不知道这如何工作。

标签: pythonloopsscripting

解决方案


您的线路:

for itervar in line:

遍历输入的每个字符,这对于您的第一个输入 ( 1.5) 会导致三个迭代:

1
.
5

因此,对于第一次迭代,您的总数增加了1,而对于第二次迭代,您尝试将.其用作数字,但失败了。(因此,为什么你的最终值,在添加 后5 + 5 + 5,是16

您应该考虑将整个输入字符串转换为数字,而不是使用 for 循环来迭代您的输入。

作为额外的奖励......

考虑您是否真的需要重新计算每个循环的平均值。由于您有total和,因此我建议您根据这两个数字count计算您的平均值on-demand 。


推荐阅读