计算迭代,包括异常(不希望包含异常)

时间:2019-02-06 01:28:02

标签: python

我正在研究《 Python for Everybody》一书(Py4E)。有问题请问

  

编写一个程序,该程序反复读取数字,直到用户输入“完成”为止。输入“完成”后,打印出总数,总数和平均值。   如果用户输入的不是数字,则使用try来检测他们的错误。     ,然后显示错误消息并跳至下一个数字。

问题是“计数”包含数字以外的条目。我想知道如何编写代码来避免这种情况。我为解决该问题而编写的代码如下。

我尝试将except变量上方的counter和其他一些缩进操作重新定位。还尝试在int()上使用read_num函数。

tally=0
counter = 0
while True:

    read_num = input("please provide a number... ")
    try:
        if read_num=='Done' or read_num =='done':
            break
        else:
            counter = int(counter)+1
            tally = int(tally) + int(read_num)
            avg = tally/counter
    except:
        print("Enter a number... ")

print("total is: " + str(tally))
print("the total number of enteries was: " + str(counter))
print("the average number entered was: " + str(avg)) 

预期结果是,当不输入数字时,try块将被绕开,而except块将被激活,从而避免了counter中的额外循环。

3 个答案:

答案 0 :(得分:3)

嘿,您实际上很近。您要在之前之前将计数递增为一个整数(将其解析为int,这将引发valueError异常,而不是数字)。理想情况下,一旦您知道read_num可以解析为一个int,而不是之前,就希望增加计数器。

答案 1 :(得分:0)

您似乎在像交易一样思考try块。使用基于事务的方法,如果在该块中遇到异常,则将回滚在该块中执行的所有代码。

实际上,python执行try块中的每一行,并且只有在遇到异常时才跳转到except块。这意味着将保留成功的代码行所做的更改。

counter = int(counter) + 1总是会成功的-因为counter已经是一个整数。该行成功执行,然后在下一行捕获异常。将第一行移到第二行之下,或者将其完全移到try块之外,并包含一个else块。 else块仅在try成功的情况下执行(最佳实践是在try块中仅包含您期望异常的行):

tally=0
counter = 0
avg = 0
while True:
    read_num = input("please provide a number... ")
    if read_num=='Done' or read_num =='done':
        break
    else:
        try:
            tally = int(tally) + int(read_num)
        except:
            print("Enter a number... ")
        else:
            counter = int(counter)+1

if counter > 0:
    avg = tally/counter

print("total is: " + str(tally))
print("the total number of enteries was: " + str(counter))
print("the average number entered was: " + str(avg)) 

答案 2 :(得分:-1)

我要离开这个,以防万一其他人碰到这个(这似乎很受欢迎)。

我将avg = 0作为标志包含在内,因此,如果在第一个输入处输入完成,则尝试除以零不会有错误。

此外,在read_num == int(read_num)之前包含counter = counter + 1,以便在程序到达计数器之前引发异常。

tally = 0
counter = 0
avg = 0

while True:

    read_num = input("please provide a number... ")
    try:
        if read_num=='Done' or read_num =='done':
            break
        else:
            read_num == int(read_num)
            counter = int(counter)+1
            tally = int(tally) + int(read_num)
            avg = tally/counter
    except:
        print("Enter a number....")

print("total is: " + str(tally))
print("the total number of enteries was: " + str(counter))
print("the average number entered was: " + str(avg))