我正在研究《 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
中的额外循环。
答案 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))