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

编写字母成绩转换器时,输入y/n结束循环触发NameError

解决字母成绩转换器中输入Y触发NameError的问题

看起来你遇到的是个很典型的Python新手坑——把字符串值当成变量名来引用了!虽然你在开头定义了choice变量,但问题根本不在这,大概率出在你判断用户输入的逻辑里。

错误根源解析

当你写类似if choice == y:这样的代码时,Python会把y当成一个变量名去内存里查找,而不是把它当作字符串"y"来比较。如果你的代码里从来没定义过名为y的变量,自然就会抛出NameError: name 'y' is not defined。哪怕用户输入的是大写的Y,如果你的判断逻辑里写的是Y(没加引号),同样会触发这个错误。

修正后的示例代码

下面是调整后的完整代码,帮你解决这个问题,同时优化了输入合法性判断:

def grade_converter(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D'
    else:
        return 'F'

# 初始化choice,避免循环前未定义的潜在问题
choice = 'y'

while choice.lower() == 'y':
    try:
        score = int(input("请输入0-100之间的分数:"))
        if 0 <= score <= 100:
            print(f"对应的字母成绩是:{grade_converter(score)}")
        else:
            print("请输入0-100范围内的分数!")
    except ValueError:
        print("输入无效,请输入整数分数!")
    
    # 关键修正:把比较的字符串用引号包裹,同时处理大小写和空格
    choice = input("是否继续转换?(y/n): ").strip()

print("程序结束!")

核心优化点

  • 字符串必须加引号:比较时用'y'或"y",明确告诉Python这是一个字符串常量,不是变量
  • 兼容大小写输入:用choice.lower() == 'y'可以同时识别用户输入的Y、y,配合strip()还能处理输入时不小心加的空格
  • 异常处理:避免用户输入非整数时程序崩溃

所以结论是:你开头定义choice变量的操作完全没问题,错误根源是判断条件里的字符串没加引号,导致Python把它当成了未定义的变量。调整后就能正常运行啦!

内容的提问来源于stack exchange,提问作者Shaun Zinckgraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:03:59