如何在Python 3中尽早结束条件?

时间:2018-03-07 05:12:50

标签: python

我想知道是否有任何方法可以提前终止条件。例如,当我运行代码并输入介于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")

3 个答案:

答案 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)

分开你的问题。你试图在这里做两件事:

  1. 验证您的输入
  2. 计算平均值
  3. 为每个......井......函数编写单独的函数!

    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)