Python新手求助:多规则密码校验while循环运行异常及else语句无效问题
基于while循环的多规则密码校验实现
原代码核心问题定位
- 混淆函数本身与函数调用结果:判断循环条件时写
chk_minlength == False,此处chk_minlength是定义的校验函数对象,不是函数执行后返回的布尔值,函数对象永远不可能等于布尔值False,导致while循环从启动条件上就无法正常执行。正确写法需要调用函数(即加括号写成chk_minlength() == False)并存储返回值供后续判断 - 校验结果未同步更新:原来的校验函数直接依赖外层作用域的
password变量,每次循环获取用户新输入的密码后,没有重新调用校验函数计算最新结果,后续判断始终沿用第一次输入对应的旧结果,无法响应新的输入内容 - 初始校验结果未落地:原代码单独调用了所有校验函数,但没有把函数返回的布尔值存储为变量供后续判断使用
- 提示语存在表意遗漏:原代码中“密码不能包含空格”的提示漏写了核心动词,会出现语义不通的问题
- else语句失效的根源:while循环的判断条件从一开始就不成立,循环体根本不会被执行,嵌套在循环内的所有分支判断自然无法触发
可正常运行的参考实现
保留你原本的代码结构,仅修正逻辑错误,方便对照理解差异:
def chk_password(): # 输出密码规则说明 print('\n\n请设置新密码') print('密码长度要求为6-15位') print('密码不能包含任意大小写形式的"umgc"字符组合') print('密码不能包含空格') print('密码必须包含"*"字符\n') while True: password = input('\n请输入你的密码:\n') # 定义校验逻辑,接收传入的密码字符串作为参数 def chk_minlength(pwd): return len(pwd) >= 6 def chk_maxlength(pwd): return len(pwd) <= 15 def chk_spaces(pwd): return ' ' not in pwd def chk_specchar(pwd): return '*' in pwd def chk_umgc(pwd): return 'umgc' not in pwd.lower() # 每次输入后立刻调用所有校验函数,存储当前输入对应的校验结果 min_len_pass = chk_minlength(password) max_len_pass = chk_maxlength(password) no_space_pass = chk_spaces(password) has_star_pass = chk_specchar(password) no_umgc_pass = chk_umgc(password) # 所有规则通过时终止循环 if min_len_pass and max_len_pass and no_space_pass and has_star_pass and no_umgc_pass: print('密码已符合所有设置规则,感谢配合。') break # 逐条提示不通过的规则,引导用户修正 print('密码不符合要求,请对照以下问题修正:') if not min_len_pass: print('密码长度不能少于6位') if not max_len_pass: print('密码长度不能超过15位') if not no_space_pass: print('密码中不能包含空格') if not has_star_pass: print('密码必须包含"*"字符') if not no_umgc_pass: print('密码不能包含任意大小写组合的"umgc"字符串') chk_password()
内容的提问来源于stack exchange,提问作者Mr. T
相关产品推荐
相关产品推荐

