我想知道是否有任何方法可以提前终止条件。例如,当我运行代码并输入介于0到100之间的所有值时,程序会执行它应该执行的操作。但是,我们假设我将负数作为输入#3。程序一直持续到最后,然后我得到"输入无效。输入介于0-100和#34;之间的数字。我想知道一旦我输入一个不在0-100之间的数字,我是否有任何方法可以收到该消息。我是一个完全的初学者,所以我真的不知道自己在做什么。
def e5():
stdnt1 = float(input("Enter the first grade: "))
stdnt2 = float(input("Enter the second grade: "))
stdnt3 = float(input("Enter the third grade: "))
stdnt4 = float(input("Enter the fourth grade: "))
stdnt5 = float(input("Enter the fifth grade: "))
if(0 <= (stdnt1 and stdnt2 and stdnt3 and stdnt4 and stdnt5) <= 100):
avrg = (stdnt1 + stdnt2 + stdnt3 + stdnt4 + stdnt5) / 5
print("The groups average is", avrg)
grades = [stdnt1, stdnt2, stdnt3, stdnt4, stdnt5]
grades.sort()
print("The lowest grade is", grades[0])
else:
print("Invalid input. Enter number between 0-100")
答案 0 :(得分:0)
是。只要获得输入,就执行一些初步检查。例如:
stdnt3 = float(input("Enter the third grade: "))
if not (0 <= stdnt3 and stdnt3 <= 100):
raise SystemExit("Error: value is not between 0 and 100.")
stdnt4 = float(input("En...
请注意,您的if条件并不像您期望的那样有效。这样:
if(0 <= (stdnt1 and stdnt2 and stdnt3 and stdnt4 and stdnt5) <= 100):
将(逻辑上)变成:
# Step 1
booleanValue = stdnt1 and stdnt2 and stdnt3 and stdn4 and stdnt5 # a True or False
# Step 2
if 0 <= (booleanValue) <= 100
# Step 3
if (0 <= booleanValue) <= 100
# Step 4
if TrueOrFalse <= 100
TrueOrFalse将为True
(通常为1号)或False
(通常为0号)。这意味着if条件将始终评估为True,并且永远不会调用else
。而是单独检查每个值,使用多个if语句或单个if语句:
if (0 <= stdnt1 and stndt1 <= 100) and (0 <= stndt2 and stndt2 <= 100) and ...
答案 1 :(得分:0)
我建议编写一个接受输入并处理它的函数。
def get_input(prompt):
response = float(input(prompt))
if 0 <= response <= 100:
return response
raise ValueError("Invalid input - enter number between 0-100")
这也有简化你的功能的前5行的优势。
def e5():
stdnt1 = get_input("Enter the first grade")
# ...
您还可以更改该功能,继续使用while循环询问用户是否有效输入。
希望这足以让你开始。
答案 2 :(得分:0)
分开你的问题。你试图在这里做两件事:
为每个......井......函数编写单独的函数!
def validate_grade(grade):
if grade < 0 or grade > 100:
raise InvalidGrade() # This is a custom exception, I'll explain momentarily
return grade
因此,此函数将检查给定数字是否介于0和100之间,否则会引发异常。在这种情况下,它是一个自定义异常,因此我们只有在出现这种特殊情况时才能捕获它。在所有其他情况下,将引发正常的Python异常。
让我们定义那个例外。
class InvalidGrade(Exception):
pass
这只是一个标准异常,名称不同!简单但非常有帮助,这里有:
try:
stdnt1 = validate_grade(float(input("Enter the first grade: ")))
stdnt2 = validate_grade(float(input("Enter the second grade: ")))
stdnt3 = validate_grade(float(input("Enter the third grade: ")))
stdnt4 = validate_grade(float(input("Enter the fourth grade: ")))
stdnt5 = validate_grade(float(input("Enter the fifth grade: ")))
except InvalidGrade:
print("Invalid input. Enter number between 0-100")
else:
calculate_grades(stdnt1, stdnt2, stdnt3, stdnt4, stdnt5)
大!现在它将收集输入,如果其中任何一个输入无效,则引发异常,否则它将执行尚未定义的calculate_grades
函数。但在我们这样做之前,我们有一些非常重复的代码要清理。
让我们问自己,我们在这5个等级中真正重复了什么。每行之间的唯一区别是&#34;第一&#34;,&#34;第二&#34;,&#34;第三&#34;等
啊哈!我们可以创建一个等级名称列表,然后python可以循环遍历该列表以构建等级值列表。
grade_names = ["first", "second", "third", "fourth", "fifth"]
try:
grade_values = [validate_grade(float(input("Enter the %s grade: " % name)))
for name in grade_names]
except InvalidGrade:
print("Invalid input. Enter number between 0-100")
else:
calculate_grades(*grade_values)
首先,我们只需通过创建字符串列表来定义成绩名称列表。
然后在try块中我们使用一个名为list comprehension的东西。它只是一个为列表中的每个项目进行求值的语句,在这种情况下,该语句是函数validate_grade
,它恰好将输入的结果作为参数浮动,并返回一个值,该值将是保存在我们的成绩值列表中。
然后,calculate_grades
不是将每个项目逐个传递给*
,而是告诉python将列表的元素扩展为函数的参数。现在,如果你要说,添加或删除成绩,你只需要在一个地方更改你的代码。
现在为最后一部分,我们定义calculate_grades
def calculate_grades(*args):
avrg = sum(args) / len(args)
print("The groups average is", avrg)
print("The lowest grade is", min(args))
整个解决方案
GRADE_NAMES = ["first", "second", "third", "fourth", "fifth"]
class InvalidGrade(Exception):
pass
def validate_grade(grade):
if grade < 0 or grade > 100:
raise InvalidGrade()
return grade
def calculate_grades(*args):
print("The groups average is", sum(args) / len(args))
print("The lowest grade is", min(args))
try:
grade_values = [validate_grade(float(input("Enter the %s grade: " % name)))
for name in GRADE_NAMES]
except InvalidGrade:
print("Invalid input. Enter number between 0-100")
else:
calculate_grades(*grade_values)