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

Python猜数字游戏输入非数字后触发ValueError报错问题求助

问题排查与修复方案

错误触发原因

  • 核心问题1:Python中字符串属于不可变类型,参数传递为值传递,你在valid_ges函数内部修改的num是局部变量,不会同步修改全局的ges变量。你第一次输入的t一直存在全局ges里,后续哪怕你在函数里输入了合法数字,最后执行ges = int(ges)的时候还是拿最早的t做转换,直接触发ValueError。
  • 核心问题2:valid_ges函数没有写返回值,你调用完校验函数拿不到正确的输入结果,而且你连续调用了两次valid_ges(ges),等于重复跑了两次校验逻辑,这也是运行日志里出现重复输出的原因。
  • 核心问题3:校验逻辑顺序完全错误:
    1. elif num != num.isdigit()的判断逻辑不成立,num.isdigit()返回的是布尔值,和字符串num比较永远为真,永远不会走到后面的范围判断分支
    2. 你还没把num转成整数就判断num > 100,字符串和整数比较会直接报错。

修复后的完整代码

import random

def valid_ges():
    while True:
        num = input("猜一个1到100之间的数字:")
        print("你输入的是:"+str(num))
        # 先判断是不是数字
        if not num.isdigit():
            print("请输入100以内的正整数,不要输入字母,示例:42")
            continue
        # 转成整数再判断范围
        num = int(num)
        if num > 100 or num < 1:
            print("请输入1到100之间的数字")
            continue
        # 校验通过返回合法数字
        return num

# 只调用一次校验函数,直接拿到合法的数字
ges = valid_ges()
r = random.randint(1, 100)

while ges != r:
    print(f"你还差{abs(r - ges)}就猜对了")
    ges = valid_ges()

print("恭喜你猜对了!")

改动说明

  • 调整校验函数逻辑,不需要传参,直接在函数内部处理输入,校验通过后直接返回合法的整数,不需要外部再做类型转换
  • 删掉重复的校验函数调用,避免重复执行逻辑
  • 调整判断顺序:先判断是否为数字,转成整数后再判断数值范围,避免类型错误
  • 后续猜数字的循环里也复用校验函数,避免用户后续输入非数字内容再次触发报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:00