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

为何函数内的while循环被忽略?密码验证程序异常排查

账号验证函数无法进入循环的问题分析

我写了一个用于验证账号信息的函数,接收password、userID、pin作为参数,与预定义字典info中的账号信息匹配验证;要求三类信息累计错误次数达3次时终止while循环。但输入信息后程序直接以退出码0结束,完全没进入循环执行。请帮忙分析原因。

用户提供的代码:

info = {"password0": "FelixIscool3103",
    "PIN0": "3456",
    "UserID0": "Felixx",
    "password1": "JohnSmith348",
    "PIN1": "7845",
    "UserID1": "JohnSmithy99"}


def checker(password, user_id, pin, strike_pass, strike_id, strike_pin):
    while strike_id and strike_pass and strike_pin != 3:
        for i in range(0, len(info), 3):
            if password == info["password"+str(i)]:
                return print("Correct password")
            break
        else:
            strike_pass + 1
            return print("Password is incorrect")


        for x in range(2, len(info), 3):
            if user_id == info["UserID"+str(i)]:
                return print("Correct user ID")
            break
        else:
            strike_id + 1
            return print("Wrong user ID")


        for y in range(1, len(info), 3):
            if pin == info["PIN" + str(i)]:
                return print("Correct user ID")
            break
        else:
            strike_pin + 1
            return print("PIN incorrect")



checker(input("Enter your password"),
        input("Enter your user ID"),
        input("Enter your pin"),
        0, 0, 0)

问题原因分析

  • while循环条件完全错误:初始传入的strike_pass、strike_id、strike_pin都是0,原条件strike_id and strike_pass and strike_pin !=3等价于0 and 0 and True,布尔值为False,循环直接不执行。你要实现的是“累计错误次数未达3次时继续循环”,应该改成判断总错误次数小于3(比如strike_pass + strike_id + strike_pin < 3)。
  • return语句直接终止函数:每个验证分支都用了return print(...),return会直接结束函数,不管后续代码。哪怕进入循环,第一次验证后函数就直接返回了,既走不到后面的ID、PIN验证,也无法触发循环迭代。
  • 错误计数未生效:strike_pass + 1只是做了加法运算,没有把结果赋值回变量,应该改成strike_pass += 1,否则错误次数永远不会增加,循环条件永远不变。
  • 字典遍历逻辑错误:
    • len(info)是6,range(0,6,3)会得到0、3,但字典里只有password0、password1,password3不存在,会抛出KeyError。
    • 验证用户ID时用了info["UserID"+str(i)],这里的i是第一个for循环的变量,和当前遍历的x无关,逻辑完全混乱。正确的做法应该是遍历用户索引(0和1),同时验证对应用户的密码、ID、PIN。
  • 代码结构缩进错误:第一个for循环的else块执行后直接return,后面的ID、PIN验证代码永远不会被执行,因为它们在else块外面,而第一个for要么break要么触发else return,后续代码完全不可达。

修正后的示例代码

info = {"password0": "FelixIscool3103",
        "PIN0": "3456",
        "UserID0": "Felixx",
        "password1": "JohnSmith348",
        "PIN1": "7845",
        "UserID1": "JohnSmithy99"}

def checker():
    total_strikes = 0
    while total_strikes < 3:
        password = input("Enter your password: ")
        user_id = input("Enter your user ID: ")
        pin = input("Enter your pin: ")
        
        # 验证是否匹配任意一个用户的完整信息
        matched = False
        for i in range(2):  # 两个用户,索引0和1
            if (password == info[f"password{i}"] 
                and user_id == info[f"UserID{i}"] 
                and pin == info[f"PIN{i}"]):
                print("账号信息验证通过!")
                return
        
        # 验证失败,累计错误次数
        total_strikes += 1
        print(f"信息验证失败,剩余尝试次数:{3 - total_strikes}")
    
    print("错误次数达3次,验证终止")

checker()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:45:39