编写字母成绩转换器时,输入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
相关产品推荐
相关产品推荐

