密码三次尝试登录授权代码异常问题咨询
问题分析&解决方案
你的代码逻辑出现了嵌套循环的跳出漏洞:当第一次输入错误密码后进入for循环,哪怕中途输入正确密码,break只能跳出当前的for循环,之后直接执行外层的break跳出while循环,根本没机会回到密码正确的判断分支(也就是else块),所以永远不会触发"Permission granted..."的授权提示。
另外原代码的重试次数逻辑也有小问题:range(0,2)只会循环2次,加上第一次输入总共是3次尝试,但代码里的if tries==2:判断永远不会触发,因为tries的取值只有0和1。
修正后的代码方案(简洁直观版)
我们可以简化循环结构,用计数器清晰管理重试次数,逻辑更顺畅:
elif loginChoice.lower() == "doctor": # 用lower()统一判断,避免大小写问题 max_tries = 3 input_pass = input("Input doctor's password:(see line 1 of code) ") for attempt in range(1, max_tries): # 第一次已输入,剩下max_tries-1次重试机会 if input_pass == adminPass: print("Permission granted...") print(" ") # 这里添加登录成功后的业务逻辑 break # 密码错误时提示剩余次数 remaining = max_tries - attempt print(f"Wrong password! Only {remaining} tries left.") input_pass = input("Input doctor's password:(see line 1 of code) ") else: # 循环正常结束(没被break中断),说明所有尝试都用完了 if input_pass == adminPass: print("Permission granted...") print(" ") else: print("All attempts used. Access denied.")
另一种更直白的while循环实现
如果觉得for循环的else结构有点绕,也可以用while循环+状态标记的写法,逻辑更易懂:
elif loginChoice.lower() == "doctor": attempts_left = 3 is_authenticated = False while attempts_left > 0: input_pass = input("Input doctor's password:(see line 1 of code) ") if input_pass == adminPass: is_authenticated = True break attempts_left -= 1 if attempts_left > 0: print(f"Wrong password! Only {attempts_left} tries left.") if is_authenticated: print("Permission granted...") print(" ") # 登录成功后的逻辑 else: print("All attempts used. Access denied.")
关键改进点
- 用
loginChoice.lower()统一判断,避免用户输入大小写不同导致的判断失效 - 去掉冗余的嵌套循环,用单一循环+计数器管理重试次数,逻辑清晰不混乱
- 每次输入后立即检查密码正确性,正确就直接触发授权逻辑并跳出循环,不会遗漏分支
- 明确处理所有尝试失败的场景,逻辑闭环更完整
内容的提问来源于stack exchange,提问作者Doobius
相关产品推荐
相关产品推荐

