为何Python PIN验证代码误将'.'和'-'视为合法字符?
PIN码验证代码的问题分析与修复
问题根源
你的代码逻辑存在致命错误:在循环中,只要第一个字符是数字就直接返回True,完全没有检查后续字符是否合法。
拿你的测试用例举例:
'12.0':长度为4,进入分支后,第一个字符'1'是数字,代码直接返回True,根本没处理后面的'.''111-':同理,第一个字符'1'合法就直接返回True,忽略了最后的'-''1234.0':长度为6,第一个字符合法就返回True,没检查中间的'.''44444-':长度为6,第一个字符合法就返回True,没检查最后的'-'
而且你的循环逻辑仅在第一个字符非法时才会触发break并返回False,只要首字符合法,后续字符的合法性完全不会被验证。
修复后的代码
写法一:遍历所有字符验证
def validate_pin(pin): # 先检查长度是否符合4位或6位要求 if len(pin) not in (4, 6): return False # 逐个检查每个字符,只要有一个非数字就返回False for char in pin: if not char.isdigit(): return False # 所有字符都合法,返回True return True
写法二:简洁的内置方法组合
利用Python字符串的isdigit()方法,结合长度判断实现更简洁的逻辑:
def validate_pin(pin): return len(pin) in (4, 6) and pin.isdigit()
注:
isdigit()对纯阿拉伯数字字符串完全适用,符合ATM PIN码的验证需求。
测试验证
用你的四个错误案例测试修复后的代码,结果均返回False,能够正确拦截非法输入,符合需求。
内容的提问来源于stack exchange,提问作者MrSandwiches
相关产品推荐
相关产品推荐

