Python用户名合法字符校验函数运行结果不一致原因排查
你写的异常函数的问题出在条件判断的语法不符合Python的运算规则。
你写的判断语句:
if ord(character) in spec_char or upper_case or lower_case or numb:
Python不会按照你想的「判断字符是否属于四个列表中的任意一个」来解析,而是会按运算符优先级拆分为四个独立的布尔判断做或运算:
- 第一个判断:
ord(character) in spec_char - 第二个判断:
bool(upper_case) - 第三个判断:
bool(lower_case) - 第四个判断:
bool(numb)
由于upper_case、lower_case、numb都是非空列表,Python中非空列表的布尔值恒为True,所以不管第一个判断的结果是什么,整个if条件的结果永远为True。只要函数进入循环,处理第一个字符时就会直接返回True,导致所有测试用例都输出True。
额外注意点
你给出的「修正后可正常运行的代码」和第一个正常工作的valid_char逻辑并不完全一致,不符合用户名全字符校验的需求:
valid_char逻辑:所有字符都合法才返回True,只要存在一个非法字符就返回False,符合用户名校验的要求- 你写的修正版
ok_char逻辑:只要存在一个合法字符就返回True,所有字符都非法才返回False,如果用户名中混有合法+非法字符(例如abc$123),该函数会错误返回True。如果要实现和valid_char完全等价的校验逻辑,可参考以下写法:
def ok_char(string): spec_char = [43, 45, 95] upper_case = list(range(65, 91)) lower_case = list(range(97, 123)) numb = list(range(48,58)) for character in string: x = ord(character) # 存在任意一个非法字符直接返回False if not (x in spec_char or x in upper_case or x in lower_case or x in numb): return False # 所有字符都合法才返回True return True
内容的提问来源于stack exchange,提问作者awault
相关产品推荐
相关产品推荐

