Python字符串转int触发NameError,求作业程序问题排查修复
问题排查与修复方案
核心问题分析
- NameError触发原因:当输入非有效数字(比如'f')时,
try块里的Numbers = int(input(...))执行失败,变量Numbers根本没被定义,后面的for Numbers in [Numbers]自然找不到这个变量,直接报错。 - 'done'输入逻辑错误:现在你先把输入转成整数再判断是否是'done',但'done'转int本身就会触发异常,永远走不到
break的逻辑。 - 冗余的for循环:你用
for Numbers in [Numbers]完全没必要,直接处理单个数字就行,这属于多余的代码。
修复后的代码
largest = None smallest = None while True: user_input = input("Enter a number: ") # 先判断是否输入'done',提前退出循环 if user_input == 'done': break # 再尝试转换为整数 try: number = int(user_input) except ValueError: print('invalid number') # 跳过后续处理,进入下一次循环 continue # 更新最大值和最小值 if largest is None or number > largest: largest = number if smallest is None or number < smallest: smallest = number print(largest) print(smallest)
关键修改点
- 调整输入判断顺序:先检查输入是否为'done',避免转int的异常,确保能正常退出循环。
- 明确捕获ValueError:不要用裸
except,只捕获转换整数失败的异常,更安全。 - 避免未定义变量:只有当转换成功后才会执行后续的最大值最小值更新,无效输入直接
continue跳过,不会引用未定义的变量。 - 简化逻辑:去掉冗余的for循环,直接用转换后的
number变量更新最大最小值,代码更简洁。 - 变量名规范:改用小写字母加下划线的命名风格(比如
largest而非Largest),符合Python的PEP8规范。
测试输入7、2、bob、10、4后,程序会输出10和2,完全符合作业要求。
内容的提问来源于stack exchange,提问作者N_joy
相关产品推荐
相关产品推荐

