微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用户输入重新启动程序后,程序会打印两次

如何解决用户输入重新启动程序后,程序会打印两次

用户输入导致错误排除并重新启动程序时,条件语句之后的打印功能将打印两次。我看不到在哪里两次调用该变量。

# -*- 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块将始终触发,即使引发异常也是如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。