问题描述
当用户输入导致错误排除并重新启动程序时,条件语句之后的打印功能将打印两次。我看不到在哪里两次调用该变量。
# -*- coding: utf-8 -*-
def start():
concept = ("Concept: ")
global grade
while True:
try:
grade = float(input("something: "))
break
except ValueError:
print("please type numbers")
start()
break
finally:
if grade > 100:
print("grade exceeds")
start()
break
elif grade < 0:
print("grade deficit")
start()
break
elif grade >= 90 and grade <= 100:
print(concept + "A")
elif grade >= 80 and grade <= 89:
print(concept + "B")
elif grade >= 70 and grade <= 79:
print(concept + "C")
elif grade >= 60 and grade <= 69:
print(concept + "D")
elif grade >= 0 and grade <= 59:
print(concept + "F")
else:
pass
start()
感谢您提供的任何帮助。
解决方法
不要将用于打印结果的代码放在finally()
块中。这将执行是否存在异常,因此,当递归调用返回时,它将再次执行该代码。它应该在try
块中,以便在出现错误时被跳过。
也不需要while
循环,因为您总是会中断它。您正在使用递归来重复它。
grade
不必是全局变量。
您不应该进行类似and grade <= 89
的测试。先前的elif
已经确保它小于90
。测试会将89.5
之类的情况排除在范围之外(如果您仅输入整数,请使用int()
而不是float()
)。
def start():
concept = ("Concept: ")
try:
grade = float(input("something: "))
if grade > 100:
print("grade exceeds")
start()
break
elif grade < 0:
print("grade deficit")
start()
break
elif grade >= 90:
print(concept + "A")
elif grade >= 80:
print(concept + "B")
elif grade >= 70:
print(concept + "C")
elif grade >= 60:
print(concept + "D")
else:
print(concept + "F")
except ValueError:
print("please type numbers")
start()
start()
但更一般而言,您不应使用这种递归,而应使用循环。
def start():
concept = "Concept: "
while True:
try:
grade = float(input("something: "))
break
except ValueError:
print("Please type numbers")
if grade > 100:
print("grade exceeds")
start()
break
elif grade < 0:
print("grade deficit")
start()
break
elif grade >= 90:
print(concept + "A")
elif grade >= 80:
print(concept + "B")
elif grade >= 70:
print(concept + "C")
elif grade >= 60:
print(concept + "D")
else:
print(concept + "F")
,
每次执行start()
块时,您的Except
函数都是递归的。由于grade
是全局变量,并且finally
块即使在执行异常块时也始终运行,因此您将获得与异常块执行次数相等的重复打印语句。
换句话说,如果引发错误,然后用户输入一些有效输入,那么您的finally
块的其余部分将使用原始输入再次触发。因为finally
块将始终触发,即使引发异常也是如此。