为何函数内的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
相关产品推荐
相关产品推荐

