You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在参数非数值时重启函数?GPA计算器输入校验实现

解决GPA计算器的输入验证问题

嘿,我来帮你搞定这两个输入验证的问题!针对你的GPA计算器需求,咱们一步步调整代码:

1. 参数非数值时重启函数(递归实现)

如果想用递归的方式重启函数,你可以在无效输入的分支里再次调用自身,但要记得重新获取用户输入。不过得提前说,这种方式在极端情况下(用户反复输入错误)可能触发递归深度限制,但日常使用完全没问题:

def get_num_classes(n=None):
    # 可选逻辑:如果没传参数,主动获取输入让函数更独立
    if n is None:
        n = input("Number of classes this semester: ")
    if n.isnumeric():
        return int(n)
    else:
        print("Oops, that's not a valid number. Try again!")
        # 递归调用自己,重新获取有效输入
        return get_num_classes(input("Number of classes this semester: "))

2. 修改函数实现循环重试(更稳妥的方案)

相比递归,用while循环做持续重试是更靠谱的选择,完全不用担心递归深度的问题。我们可以把输入验证的逻辑直接封装在函数内部:

def get_num_classes():
    while True:
        input_str = input("Number of classes this semester: ")
        if input_str.isnumeric():
            return int(input_str)
        else:
            print("Invalid input! Please enter a numerical value.")

这种情况下,主文件的调用代码可以简化,不用自己传input了:

num_classes = grade_fcns.get_num_classes()

如果想保留你原来的函数参数设计(接收传入的输入字符串),也可以这么改:

def get_num_classes(n):
    while not n.isnumeric():
        print("That's not a number. Let's try again.")
        n = input("Number of classes this semester: ")
    return int(n)

对应的主文件调用还是原来的写法,但第一次输入无效时,函数会自动循环获取新输入直到有效:

num_classes = grade_fcns.get_num_classes(input("Number of classes this semester: "))

额外优化:更健壮的数值验证

isnumeric()方法对罗马数字、特殊格式数字也会返回True,如果要更精准验证整数输入,推荐用try-except块:

def get_num_classes():
    while True:
        try:
            num = int(input("Number of classes this semester: "))
            # 额外校验:课程数量不能为0或负数
            if num <= 0:
                print("Number of classes can't be zero or negative. Try again.")
                continue
            return num
        except ValueError:
            print("Please enter a valid integer number.")

内容的提问来源于stack exchange,提问作者John Allison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:43:38